Cuda 如何对大小相等的线段进行分段归约和?

Cuda 如何对大小相等的线段进行分段归约和?,cuda,thrust,reduction,Cuda,Thrust,Reduction,我有一系列M单通道图像,每个图像大小NxN,连续存储在设备内存阵列中。(N不是二的幂。)因此,数组的长度为MxNxN。我需要找到每个图像的所有像素的总和。因此,输出是M值,每个图像一个 我正在生成一个额外的数组,该数组保存每个像素的图像索引,并使用该索引对每个图像(段)按键缩小。这个reduce\u by\u key看起来相当慢,比我在这些像素上做的其他事情花费更多的时间 有没有一种更快的方法来进行分段归约求和,其中分段的大小都相同?OpenCV提供了一个使用CUDA实现的矩阵归约API。你可以

我有一系列
M
单通道图像,每个图像大小
NxN
,连续存储在设备内存阵列中。(
N
不是二的幂。)因此,数组的长度为
MxNxN
。我需要找到每个图像的所有像素的总和。因此,输出是
M
值,每个图像一个

我正在生成一个额外的数组,该数组保存每个像素的图像索引,并使用该索引对每个图像(段)按键缩小。这个
reduce\u by\u key
看起来相当慢,比我在这些像素上做的其他事情花费更多的时间


有没有一种更快的方法来进行分段归约求和,其中分段的大小都相同?

OpenCV提供了一个使用CUDA实现的矩阵归约API。你可以在这里找到它

如果您不想包含额外的第三方库,可以使用cublas。在这种情况下,您的任务可以用matlab代码表示,如下所示

result(1:M) = sum(images(1:N*N, 1:M), 1);
这相当于

result(1:M) = ones(1, N*N) * images(1:N*N, 1:M);
这是一个矩阵向量乘法运算,可以通过CUBLAS提供的BLAS 2函数
cublasgemv()
高效地完成

另一方面,在任务中使用
reduce\u by\u key()
不需要生成额外的图像索引数组。Stress中的花式迭代器是为这种情况设计的,以减少全局mem带宽需求

有关更多详细信息,请参阅此答案


OpenCV提供了一个使用CUDA实现的矩阵缩减API。你可以在这里找到它

如果您不想包含额外的第三方库,可以使用cublas。在这种情况下,您的任务可以用matlab代码表示,如下所示

result(1:M) = sum(images(1:N*N, 1:M), 1);
这相当于

result(1:M) = ones(1, N*N) * images(1:N*N, 1:M);
这是一个矩阵向量乘法运算,可以通过CUBLAS提供的BLAS 2函数
cublasgemv()
高效地完成

另一方面,在任务中使用
reduce\u by\u key()
不需要生成额外的图像索引数组。Stress中的花式迭代器是为这种情况设计的,以减少全局mem带宽需求

有关更多详细信息,请参阅此答案


演示了Eric描述的奇特迭代器方法。演示了Eric描述的奇特迭代器方法。