float devPtr;
int pitch;
cudaMallocPitch((void **)&devPtr,&pitch,widthsizeof(float),height);
myKernel<<<100,512>>>(devPtr,pitch);
.
.
globle void myKernel(float *devPtr,int pitch)
{
for(int r=0;r<height;++r)
{
float *row=(float *)((char )devPtr+rpitch);
for(int c=0;c<width;++c)
{
float element =row[c];
}
}
}
请问:红色那句代码为什么要先(char *),再(float *)?我感觉直接float row=devPtr+rpitch/sizeof(float)就行啊。
LZ您好:
因为pitch是按字节数计算的,所以上文代码中会这样处理。((char*)以后,指针的偏移量按照BYTE计算,这样就和pitch一致了,计算到所需地址以后,再转换回(float*)这样偏移量按照4B计算,也与左边保持一致。)
以及,您给出的实现实际上和上文中的实现是等效的。
大致如此,您可以选择任何正确的同时符合您习惯的用法加以使用。
祝您编码顺利~
您好版主,非常感谢您的解答~我明白了。
不客气的,十分荣幸为您服务!
欢迎您经常来论坛!
祝您好运~