ArrayFire GFOR循环意外错误

时间:2019-06-27 09:43:47

标签: c++ parallel-processing opencl arrayfire

我正在尝试使用GFOR构造,但我什至无法使其适用于基本内容。

我怀疑GFOR循环不适用于线性索引,对吗?

有些代码示例不起作用

af::array x(100, 200);
af::array y(100, 200);
af::array xx(100, 200);
gfor(af::seq i, (100 * 200)) {
    xx(i) = x(i) + y(i);
}

这应该在元素上做一个简单的加法运算(我知道我可以做xx = x + y,我只想证明gfor不能按预期工作)。错误是 输入的无效大小:函数seqToDims中的203。

另一个是更简单的程序,像这样

af::array x(100, 200);
af::array y(100, 200);
gfor(af::seq i, (100 * 200)) {
    y(i) = x(i) + 1;
}

相同的错误。

我看过文档,我认为gfor不适用于线性索引,我需要以某种方式“逐行”或“逐列”工作,因为文档中的示例始终显示类似A(span,i)而不显示A(i)。

除此之外,我真正想做的事情很简单: 我有: 阵列图像(行,列), 数组x_(8,rows * cols), 数组ax(8,1); 和一个由sum(x_(span,i)* ax)找到的标量 (实际上是点积,但gfor不支持dot()函数),该标量是通过使用x_(大小为8)的列和也是大小为8的斧头来计算的。

我想要

e(i) = image(i) - sum<float>(ax * x_(span,i));

我似乎无法使其工作,因为即使是上面的简单gfor循环也无法正常工作,这是出乎意料的,我在做什么错了?

谢谢!

1 个答案:

答案 0 :(得分:0)

您已经声明了二维数组,但您试图仅用一维来处理它们。你不能有

array x(100, 200);
x(150) = 10;   // The second dimension is missing here.

您可以使用 gfor 创建一个序列并在其中一个维度中使用此序列。您可以使用通常的方法来解决另一个维度,即“跨度”。

array x(100, 200); // 100 columns, 200 rows
gfor (seq i, 200) {   // will create a sequence from 0...199
   x(span, i) += 10;  // will take a slice of x: the entire column (span) of row 'i'
                      // and add the value 10 to it
}

注意 x 现在是用二维寻址的吗?第一个维度是 span,换言之,该维度的整个跨度。第二个维度是 gfor 中定义的序列。您当然可以交换尺寸:

array x(100, 200); // same as above
gfor (seq i, 100) {  // create  a sequence from 0..99  (not 199)
   x(i, span) += 20; // access x by rows (span) and the sequence i
}

从你的代码中我可以推断出你仍然在线性/顺序地思考,就像一个 C(++) 程序员。赠品是 seq i, (100*200) 您正在尝试遍历整个元素(行*列),但 arrayfire 使用向量算术。您不想访问单个元素。您想访问向量/切片/整行或列并对其进行处理。

对于您实际尝试完成的内容 (e(i) = image(i)...),请查看 arrayfire 批处理函数。这可能会有所帮助。