收录日期:2020/11/29 21:16:29 时间:2016/08/24 12:18:09 标签:C++ 语言
结构体定义:
struct PicDataStruct
{
BYTE* pData;
int width;
int height;
int widthstep;
}
程序中出问题的地方:
PicDataStruct Weight_DestinyD;

Weight_DestinyD.width = pWeight_Destiny->width;
Weight_DestinyD.height = pWeight_Destiny->height;
cudaMalloc((void**)&Weight_DestinyD.pData,Weight_DestinyD.width*Weight_DestinyD.height);
cudaMemcpy(Weight_DestinyD.pData,pWeight_Destiny->imageData,Weight_DestinyD.width*Weight_DestinyD.height,cudaMemcpyHostToDevice);

调试结果显示 pWeight_Destiny->width的值赋给了Weight_DestinyD.height,而Weight_DestinyD.width是一个很大的值;pWeight_Destiny->imageData的数据也没有传给Weight_DestinyD.pData,Weight_DestinyD.pData值全0,并且pData提示是错误的指针,求解问题出在哪,以及如何解决?谢谢各位了
你的指针没有初始化,给它赋值能不出错?
width与height赋值出错,可能是你指针操作或取值出了问题,再贴些相关代码上来吧
pData申请内存失败?
单步调试看下吧

struct PicDataStruct
{
BYTE* pData;
int width;
int height;
int widthstep;
};

结构体应该有";"结束符。
Weight_DestinyD有没有初始化?
仅仅是代码片段,同时那么多自己写的函数,不好看了。
Struct of arrays is a nightmare in cuda.

当你的结构体中含有指针的时候,进行 Copy 请参加下面链接中给出的步骤:
http://stackoverflow.com/questions/9309195/copying-a-struct-containing-pointers-to-cuda-device#comment11744623_9309195

相信看了上面的示例,楼主的问题应该可以解决,Good Luck!
首先谢谢各位的解答,我把这一部分完整的代码贴一下吧:
BOOL GPUProcess(IplImage** pSource,IplImage* pWeight_Destiny,double*** WeightTemp,double*** ResultTemp, HostDataConstant& m_data_constant)
{
PicDataStruct *pSourceD = NULL;
PicDataStruct Weight_DestinyD;

Weight_DestinyD.width = pWeight_Destiny->width;
Weight_DestinyD.height = pWeight_Destiny->height;
cudaMalloc((void**)&Weight_DestinyD.pData,Weight_DestinyD.width*Weight_DestinyD.height);
cudaMemcpy(Weight_DestinyD.pData,pWeight_Destiny->imageData,Weight_DestinyD.width*Weight_DestinyD.height,cudaMemcpyHostToDevice);

int size = 0;
pSourceD = new PicDataStruct[m_data_constant.NumofImgs];
assert(pSourceD!=NULL);
if (pSourceD == NULL)
{
return FALSE;
}
for (int i = 0;i!=m_data_constant.NumofImgs;i++)
{
size = pSource[i]->width*pSource[i]->height;
cudaMalloc((void**)&pSourceD[i].pData,size);
pSourceD[i].height = pSource[i]->height;
pSourceD[i].width = pSource[i]->width;
pSourceD[i].widthstep = m_data_constant.StepHighRes;
cudaMemcpy(pSourceD[i].pData,(unsigned char*)pSource[i]->imageData,size,cudaMemcpyHostToDevice);
}
dim3 blocks(8,8);       
int tempt_size = (m_data_constant.HighSearchSize+m_data_constant.HighPatchSize)/2;
dim3 grids(((pSource[0]->width-tempt_size)/m_data_constant.SRFactor-blocks.x+1)/blocks.x,(pSource[0]->height-tempt_size)/m_data_constant.SRFactor-blocks.y+1/blocks.y);


double* WeightTempD;
size_t pitchWeight;
cudaMallocPitch((void**)&WeightTempD,&pitchWeight,m_data_constant.matrixwidth*sizeof(double),m_data_constant.matrixheight);


double* ResultTempD=NULL;
size_t pitchResult;
cudaMallocPitch((void**)&WeightTemp,&pitchResult,m_data_constant.matrixwidth*sizeof(double),m_data_constant.matrixheight);
kernel<<<grids,blocks>>>(pSourceD,&Weight_DestinyD,WeightTempD,pitchWeight,ResultTempD,pitchResult,&m_data_constant);

cudaThreadSynchronize();
cudaMemcpy(WeightTemp,WeightTempD,m_data_constant.matrixheight*m_data_constant.matrixwidth,cudaMemcpyDeviceToHost);
cudaMemcpy(ResultTemp,ResultTempD,m_data_constant.matrixheight*m_data_constant.matrixwidth,cudaMemcpyDeviceToHost);

cudaFree(Weight_DestinyD.pData);
for (int i = 0;i!=m_data_constant.NumofImgs;i++)
{
cudaFree(pSourceD[i].pData);
}
cudaFree(WeightTempD);
cudaFree(ResultTempD);

cudaFree(WeightTemp);

return TRUE;
}
从结果来看数据没有正确的送到GPU里面进行运算,问题我觉得可能出在红字那部分。
只留一段程序,编译,再找错。
代码没有问题。可以调试看看编译器生成的汇编,您是64位系统么,还是用了劣质的BCB编译器,给人感觉是编译在汇编里认为BYTE*是8字节了,多偏移了4位
引用 6 楼  的回复:
Struct of arrays is a nightmare in cuda.

当你的结构体中含有指针的时候,进行 Copy 请参加下面链接中给出的步骤:
http://stackoverflow.com/questions/9309195/copying-a-struct-containing-pointers-to-cuda-device#comment11744623_930919……


楼主,请问你看了我给你的链接地址中的内容了么?

不是说了你的结构体 PicDataStruct 中有指针,往 GPU 中拷贝的时候不能像你上面写的那样进行简单的拷贝么。希望你认真看一下给你的链接中的内容,自己尝试一下,应该可以解决你的问题。

希望楼主早点解决自己的问题,Good Luck!
我看了的,昨天贴完上面的程序去看了。已经在试,谢了

ado连接sql2000失败原因 求一下JAR文件? 请高手帮忙用C#中的“serialPort”控件做个串口调试程序 我想在显示bbbb的div时判断aaaa里的textarea是否已经输入内容 请问如何在两个 asp 中传变量? AjaxPro 运用中的问题 为什么我的List view control没有init也可以用在win32下?~~ JAVA打印问题,各种打印方案都没满足我的打印要求,难难难啊,各位帮忙找个好方法 关于注册表 急急急 有什么方法可以在页面判断上传的文件大小 整个Swing,就没有提供个方法让我知道哪个窗口是在我应用程序的最前面吗? 帮忙看一下,我用jmail组件发邮件的代码那错了?.........在线等................................... LEFT和Like那个效率高? 请问如何在查询中加自动编号~~高手帮忙~我只有30分了,解决就给 免费培训班—关于举办“嵌入式Linux开发技术普及班”的通知 在线求助:Linux下JDK的安装问题 如何用C编写:用SQL语句实现表的建立以及记录的插入、删除等操作 JAVA编程中的奇怪问题 Access数据库连接出错(急) 急!在线等.....高手帮忙,一个简单的问题。来者有分...................................................... 有了人情就不按规则做事了? ABC == Application Builder for C# 请各位大大看一下 怎么实现文本纵向排列,从左到右纵向显示的那种 免费培训班—关于举办“嵌入式Linux开发技术普及班”的通知 如何object调用xp的Movie Make! 关于CListCtrl重绘问题,在线等, xml+SQl显示数据问题 (winform)为什么点在DataGrid的Header以及表格外的边框地带,DataGrid的CurrentCell都是Cell[0,0]啊 怎样获得当前应用程序的进程ID?