我想做的是这样的: 我在第一(行)维中有一个“扩展”数组。例如,我有一个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个元素的总和。
答案 0 :(得分:1)
我认为您可以通过执行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);
这将需要您重构更多部分代码。