【发布时间】:2017-04-20 09:13:25
【问题描述】:
所以我正在开发一个 CUDA 程序,但在索引块和线程时遇到了一些问题。基本上,我正在尝试在 CUDA 中实现 Pixel Sort 算法。 (通过一项修改,我们只处理任一行或列,而不是同时处理两者)
我将其可视化的方式是简单地运行 N 个块,每个块有 1 个线程(用于行数或列数),并让每个块彼此独立地处理该行/列。
因此,如果我们想对列进行排序,我们会像这样启动内核(有几个额外的参数只与我们的特定处理相关,所以为了简单起见,我将它们省略了)
pixel_sort<<<cols, 1>>>(d_image, d_imageSort, rows, cols, ...);
然后在内核中,我用
访问块索引int tid = blockIdx.x;
这允许我在每个块中处理一行/列数据,但它有一些问题。它的运行速度比我们针对较小图像的算法的串行实现要慢,并且当图像尺寸变得太大时会直接崩溃。
我正在考虑的另一种线程方案是将图像的每个像素映射到一个线程,但是我对此有几个问题。
- 如果我们用 M 个线程启动 N 个块,用 M 行表示 N 个列,我们如何避免每个块的 512(或 1024 个?)线程限制。在这种情况下,我们可以让每个线程处理列中的多个像素吗?内核中的索引是什么样子的?
- 该算法基本上要求我们处理整个列,因此每个线程不能只对那个像素做一些工作,它们必须进行通信,大概使用共享内存。每个块有一个“主”线程来进行实际的排序计算,然后让所有其他线程参与共享内存是否是一种有效的策略?
其他说明:
- 我们的图像数据通过 OpenCV 读取,并将 RGBA 值存储在
uchar4数组中
【问题讨论】: