我想做的是:我在第一个(行)维度中有一个“展开”数组。例如,我有一个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对象添加值)。
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数组,其中每个第一个元素是扩展数组中每个块的第一个元素之和。
发布于 2019-06-25 15:06:58
我认为您可以通过执行af::moddims和af::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);这将要求您重构的代码超过这一部分。
https://stackoverflow.com/questions/56749363
复制相似问题