ArrayFire并行块总和

时间:2019-06-25 07:56:15

标签: c++ parallel-processing sum opencl arrayfire

我想做的是这样的: 我在第一(行)维中有一个“扩展”数组。例如,我有一个1080行和1920列的图像。此扩展数组为(8 * 1080)行和1920列,8表示“行块”大小。 我想要做的是制作一个新的大小为8x1的数组。 这个新数组将把每个块的总和保持在第i个(i = 0到7)。

在上面的示例中,新数组(i = 0)的第一个元素将是扩展数组中这些像素的总和(线性索引,逐列):

0,8(因为8是第二个块的第一个元素),16(第三个块).....

另一个示例是第二个元素:

1,9,17,...

我认为这可以并行化吗?我正在尝试解决此问题,但我无法尝试,我尝试了gfor但找不到解决方法,使用arrayfire是否可能?任何帮助表示赞赏!

我尝试使用gfor,但无法解决问题。

这是我尝试的一些代码:rx是8x1(p_squared_1 = 8) rx_all是扩展的(p_squared *行,列)数组。 注意,我正在使用seq“ +”运算符,因为如果我尝试编写“ i + p_squared_1”会出现歧义,我认为...这是我的错误,但是我找不到其他方法来向其中添加值一个seq对象。

Number

我希望得到一个8x1数组,其中每个第i个元素是扩展数组中每个块的第i个元素的总和。

1 个答案:

答案 0 :(得分:1)

我认为您可以通过执行af::moddimsaf::sum来实现这一目标。

array img_expanded(1080*8, 1920);

array img_expanded_reshaped = moddims(img_expanded, 8, 1920*1080);
array result = sum(img_expanded_reshaped, 1);

moddims调用将数组重塑为8x(1920 * 1080)数组,然后在第二维上进行求和。

优化布局

如果将1920面作为主导尺寸,则可以得到更好的性能。这样不仅可以与CPU内存中的图像布局相匹配,并且可以避免在往返于GPU的传输中进行转置,而且经过重整的数组将具有较大的第一维,从而具有更好的GPU利用率。

array img_expanded(1920, 1080*8);

array img_expanded_reshaped = moddims(img_expanded, 1920*1080, 8);
array result = sum(img_expanded_reshaped, 0);

这将需要您重构更多部分代码。