我是cuda的新人。我在cuda中编写图像处理代码。 我的c和cuda代码在下面,我试图转换成cuda,但它不能很好。
我的C代码:
void imageProcess_usingPoints(int point, unsigned short *img)
{
// doing image process here using point variable value.
}
int main(int argc, char **argv)
{
/* here i define and initialize some variable */
int point=0;
unsigned short *image_data;
// consider that here i read image and store all pixels value in *image_data.
for(int i=0;i<1050;i++,point+=1580)
{
// calling image process function like bluring image.
imageProcess_usingPoints(point,image_data);
/* doing some image process using that point value on 16 bit grayscale image.*/
}
return 0;
}
我试图将我的c代码转换为cuda,但它错了。 所以,我的cuda代码,我尝试过的是下面的内容。
__global__ void processOnImage(int pointInc)
{
int line = blockIdx.x * blockDim.x + threadIdx.x;
int point=((line)*pointInc));
/* here i m not getting exact vaue of point variable as same like in c code */
/* doing image processing here using point value */
}
int main(int argc, char **argv)
{
/* here i define and initialize some variable */
int pointInc=1580;
static const int BLOCK_WIDTH = 25;
int x = static_cast<int>(ceilf(static_cast<float>(1050) / BLOCK_WIDTH));
const dim3 grid (x,1);
const dim3 block(BLOCK_WIDTH,1);
processOnImage<<<grid,block>>>(pointInc);
return 0;
}
在cuda代码的processOnImage函数中,我没有像上面的c代码那样得到point(int point)变量的精确值。所以我在cuda代码中做错了什么。或者如何在c。
中为我的代码使用该块和线程答案 0 :(得分:1)
基本上你可以将每个块的线程设置为warpSize
的倍数(或者只是32的倍数)
http://docs.nvidia.com/cuda/cuda-c-programming-guide/#warpsize
对于大多数简单内核,通常256是一个很好的。确切的数字必须调整。 CUDA安装目录中的此工具也可以帮助您选择数字。
$CUDA_HOME/tools/CUDA_Occupancy_Calculator.xls
确定每个块的线程数后,您可以计算数据大小所需的块编号。以下示例说明了如何执行此操作。
https://developer.nvidia.com/content/easy-introduction-cuda-c-and-c
另一方面,您还可以使用固定数量的块来获取任意数据大小。有时你可以通过这种方式获得更高的性能。有关详细信息,请参阅此内容。
https://developer.nvidia.com/content/cuda-pro-tip-write-flexible-kernels-grid-stride-loops