【问题标题】:ArrayFire parallel block sumArrayFire 并行块总和
【发布时间】:2019-06-25 07:56:15
【问题描述】:

我想做的是: 我在第一个(行)维度中有一个“扩展”数组。例如,我有一个 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*rows, columns) 数组。 注意我使用的是 seq "+" 运算符,因为如果我尝试写 "i+p_squared_1" 会有歧义,我认为......这是我的错误,但我找不到另一种方法来添加一个值一个 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 个元素是扩展数组中每个块的第 i 个元素的总和。

【问题讨论】:

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


    【解决方案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);
    

    这将需要您重构的不仅仅是这部分代码。

    【讨论】:

    • 非常感谢,帮了大忙,没想到用moddims做,这个功能很方便。
    • 有一个问题,上面的代码是否有可能无法达到 100% 的准确率?总和是正确的,但 8 个总和中的每一个都略有不同,所以我认为这与精度和准确性无关(我使用的是浮点数,但根本没有小数部分,数字就像 1268.0、650.0 等)跨度>
    • 浮点运算总是会出现舍入错误。因为在 GPU 上执行操作的顺序是未定义的,所以值会略有不同。检查执行求和的af::array 的类型。它可能正在处理整数值,然后将它们转换为浮点数。打印函数也可能会截断值。
    • 好的,感谢您的澄清!我还有一个关于 gfor 构造的问题,我可以发一个新帖子吗?
    • 最好在我们的 slack 频道处理这类问题。 join.slack.com/t/arrayfire-org/shared_invite/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    相关资源
    最近更新 更多