因此,我正在研究CUDA程序,并且在索引块和线程时遇到一些问题。基本上,我正在尝试在CUDA中实现Pixel Sort算法。 (通过一种修改,我们只处理行或列,而不是同时处理)
我想像的方式是简单地运行N个块,每个块具有1个线程(用于行或列的数量),并使每个块彼此独立地处理该行/列。
因此,如果我们想对列进行排序,我们将像这样启动内核(有几个额外的参数仅与我们的特定处理相关,因此为简单起见,我将其省略了)
pixel_sort<<<cols, 1>>>(d_image, d_imageSort, rows, cols, ...);
然后在内核中,我使用
int tid = blockIdx.x;
这使我可以在每个块中处理一个行/列数据,但是存在一些问题。它的运行速度比我们针对较小图像的算法的串行实现慢,并且当图像尺寸太大时会直线崩溃。
我正在考虑的另一种线程方案是将图像的每个像素映射到一个线程,但是我对此有两个疑问。
其他说明:
uchar4
数组最佳答案
如果每个块只有一个线程,则会很快遇到线程占用问题。如果您的目标是进行全行排序(对于列,您可以在将图像发送到GPU之前先进行转置,以利用全局合并),那么获得不错结果的最快方法可能是对数进行基数或合并排序每行,基本上从http://mgarland.org/files/papers/nvr-2008-001.pdf复制步骤。您可以为每行分配k个m线程块,以使km> =图像宽度。然后,您将启动k *(图像高度)块。这样,您的网格的大小将为(k,height,1)。
至于您的具体问题:
关于c++ - CUDA中图像行/列的线程索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40983372/