我在 Windows 8 上将 C++ AMP 与 Visual Studio 2012 结合使用。我有一个案例,其中我有 2D array_view、experimentData
和 1D array_view、experimentFactors
。我想遍历 2D array_view 的第一个维度和 1D array_view 的第一个维度。这就是我所拥有的,但我经常收到错误消息,说没有为此重载。我想遍历第一个维度的 numberOfTests
。我想要这条线:
auto test = experimentData[idx];
返回整行数据。我认为 array_view
上的 section
方法是执行此操作的方法,但我不知道该怎么做。
array_view<int_2, 2> experimentData(numberOfTests, numberOfSolutions, initialConditionSet);
array_view<float_2, 1> experimentFactors(numberOfTests, factorData);
extent<1> e_size(numberOfTests);
parallel_for_each(e_size, [=] (index<1> idx) restrict(amp) {
auto test = experimentData.section(idx);
auto factors = experimentFactors[idx];
analysisAlgorithm(test, factors);
});
test
对象应该是 experimentData
array_view
的 1xN 部分。 factors
对象应该是 experimentFactors
array_view
中的单个项目。
澄清
experimentData
array_view 有 M 行 N 列
experimentFactors
array_view 有 M 行
最佳答案
如果您是 C++ 的工作人员并且您有类似这样的问题或处理将数据投影到不同维度的问题,请停下来阅读这篇文章:
http://blogs.msdn.com/b/nativeconcurrency/archive/2012/02/17/projections-in-c-amp.aspx
它以优美的方式处理了这个确切的问题。这是我的 parallel_for 循环现在的样子:
parallel_for_each(e_size, [=] (index<1> idx) restrict(amp) {
array_view<int_2, 1> test = experimentData[idx[0]];
auto factors = experimentFactors[idx];
analysisAlgorithm(test, factors);
});
注意 test
数组的创建发生了怎样的变化。我声明它将是 int_2
类型的一维数组。然后我使用文章中讨论的投影技术来选择具有 = experimentData[idx[0]];
的整行数据。当您只为多维数组提供一个索引时,它会选择该维度中保存的所有数据。这篇文章使这一点更清楚。
关于C++ AMP 迭代具有不同维度的 array_views,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13664844/