C ++ AMP迭代不同维度的array_views

时间:2012-12-01 23:32:06

标签: c++ visual-c++ visual-studio-2012 gpgpu c++-amp

我在Windows 8上使用C ++ AMP和Visual Studio 2012.我有一个案例,我有2D array_view,experimentData和1D array_view,experimentFactors。我想迭代2D array_view的第一维和1D array_view的1维。这就是我所拥有的,但我不断得到错误,说这没有重载。我想迭代numberOfTests这是第一个维度。我想要这条线:

auto test = experimentData[idx];

返回整行数据。我认为section上的array_view方法是这样做的,但我无法弄清楚如何。

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行

1 个答案:

答案 0 :(得分:4)

如果您是从事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]];选择整行数据。当您只为多维数组提供一个索引时,它会选择该维度中保存的所有数据。这篇文章更清楚了。