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

Posted

技术标签:

【中文标题】决定用于图像处理的 CUDA 线程和块【英文标题】:Decide CUDA threads and blocks for image processing 【发布时间】:2015-09-17 03:14:36 【问题描述】:

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

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

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

GPU Details:

NVIDIA Quadro k2000
2 GB of GDDR5 GPU memory
384 5MX CUDA parallel processing cores

由于我是 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);

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

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

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

【问题讨论】:

你会error checking吗?请发帖Minimal, Complete, and Verifiable example @m.s. : 没有错误。请告诉我,最小的工作示例可能是什么?这不是一个逻辑问题吗?我已经提供了有关我的图像、GPU、numBlocks 的所有详细信息,以及还需要什么。请让我知道还需要什么其他信息,我会发布。 你怎么知道没有错误?如果您得到一个空白图像,您的内核可能尚未运行,您可以通过检查 CUDA API 错误来检测到这一点。 MCVE 通常由可以复制、粘贴和编译的代码组成,无需进行任何必要的更改即可重现问题。 @m.s.:我想把它作为一个逻辑问题而不是家庭作业类型的问题。此外,我正在从电子显微镜相机拍摄图像,您也将需要我的图像。硬件也不同。我无法在 SO 上发布所有内容。 @skm...This 可能感兴趣。 【参考方案1】:

如果您按照我在 cmets 中的建议应用了error checking,输出将是:

invalid configuration argument

您使用的是 Quadro K2000,has Compute capability 3.0。计算能力3.0允许最大1024 threads per block。

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

【讨论】:

非常感谢。 error checking 帮了大忙。我发现内核甚至没有像你提到的那样加载。我对我的 GPU 上允许的线程数感到困惑,我无法获得有关它的信息。 你能建议我吗,可能的优化配置是什么。或者,我只需要做一个配置,可以最小化块数并最大化每个块的最大线程数? @skm 查看处理此问题的各种 SO 问题,例如:***.com/questions/11592450/…、***.com/questions/9985912/…

以上是关于决定用于图像处理的 CUDA 线程和块的主要内容,如果未能解决你的问题,请参考以下文章

CUDA线程和块解释

与 CUDA 中的线程和块并行化

CUDA 线程、SMX、SP 和块,它们是如何工作的?

CUDA中的线程和块结构以及如何分配具有不同结构的线程(c ++)

用于图像过滤的 3d CUDA 内核索引?

(py)CUDA中的网格和块尺寸[重复]