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描述的奇特迭代器方法。