Arrayfire并行块总和



我想做的是:我在第一个(行(维度上有一个"扩展"数组。例如,我有一个1080行和1920列的图像。该扩展的数组为(8*1080(行和1920列,8表示"行块"大小。我想做的是制作一个新的8x1尺寸。这个新数组将在第i-th(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" "操作员seq对象(。

af::array rx(p_squared_1, 1);
gfor(af::seq i, rows*cols*(p_squared_1-1)) {
    rx(i) = af::sum<float>(rx_all(i.operator+( (const int)p_squared_1)));
}
af::eval(rx);
cout << af::sum<float>(rx);

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

我认为您可以通过执行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);

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

相关内容

  • 没有找到相关文章

最新更新