决定图像处理的 CUDA 线程和块

skm*_*skm 1 c++ cuda image-processing

亲爱的反对者:请告诉我反对票的原因。我已经接受了一个答案,这意味着该人能够理解问题并且不需要最小的工作示例。其次,我希望它是一个概念问题,而不是一个家庭作业问题。请告诉我您投反对票的原因。

重要提示:我已经阅读了几个关于线程和块的分布的线程(例如this ),但我有一个特定的查询。

我必须unsigned char在 GPU 上处理形式的图像数据。我的图像大小(1080 x 1920)为 3 个通道,每个像素都是unsigned char类型。

GPU详细信息

NVIDIA Quadro k2000
2 GB of GDDR5 GPU memory
384 5MX CUDA parallel processing cores
Run Code Online (Sandbox Code Playgroud)

由于我是 GPU 处理新手,因此我无法了解在这种特定情况下我的 GPU 卡的每个块的线程数和块分布总数。

问题:当我对图像使用以下配置(1080 x 1920)来调用 GPU 内核时,我得到了所需的结果,但计算时间太多

dim3 numOfBlocks( (108) , (192) ); 
dim3 numOfThreadsPerBlocks( 3*10 , 3*10 ); //multiplied by 3 because we have 3 channel image now

colorTransformation_kernel<<<numOfBlocks, numOfThreadsPerBlocks>>>(numChannels, step_size, iw, ih, dev_ptr_source, dev_ptr_dst);
Run Code Online (Sandbox Code Playgroud)

但是,如果我选择以下另一种配置

    dim3 numOfBlocks( (108/2) , (192/2) ); 
    dim3 numOfThreadsPerBlocks( 3*10*2 , 3*10*2 ); //multiplied by 3 because we have 3 channel image now
Run Code Online (Sandbox Code Playgroud)

然后,我得到一张空白图像。

m.s*_*.s. 5

如果您按照我在评论中建议的那样应用了错误检查,则输出将是:

无效的配置参数

您使用的是 Quadro K2000,其计算能力为 3.0计算能力 3.0 允许每个块最多有1024 个线程。

您每个块使用的3*10*2 * 3*10*2 = 3600线程数超出了 1024 的限制。所以你的内核甚至没有运行,这就是为什么你得到一个空白图像。