首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArrayFire并行块和

ArrayFire并行块和
EN

Stack Overflow用户
提问于 2019-06-25 07:56:15
回答 1查看 230关注 0票数 2

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

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

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

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

1,9,17,.

我觉得这可以并行化吗?我正在试图解决这个问题,但我不能,我尝试了gfor,但无法找到一个方法来做,它不可能与arrayfire?任何帮助都很感激!

我试过使用gfor,但我解决不了这个问题。

下面是我尝试过的一些代码: rx是8x1 (p_squared_1 = 8),rx_all是扩展(p_squared*rows,列)数组。注意,我使用seq "+“运算符,因为如果我尝试编写"i+p_squared_1”,就会发现think...this是错误的,但是我找不到其他方法向seq对象添加值)。

代码语言:javascript
复制
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数组,其中每个第一个元素是扩展数组中每个块的第一个元素之和。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 15:06:58

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

代码语言:javascript
复制
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利用率。

代码语言:javascript
复制
array img_expanded(1920, 1080*8);

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

这将要求您重构的代码超过这一部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56749363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档