首页 > 解决方案 > 数据在 C++ AMP 数组中复制了多少次?

问题描述

我的加速器的default_cpu_access_type属性是access_type_read_write. 假设我运行这个:

std::vector<int> v{ 1, 2, 3, 4 };
Concurrency::array<int, 1> a { 4, v.begin(), v.end() };
parallel_for_each(a.extent, [=, &a](Concurrency::index<1> i) restrict(amp) { ++a[i]; });
for (int i { 0 }; i < 4; ++i) std::cout << a[i] << " ";

我的四个整数被复制了多少次?构造时是否将它们复制到 RAM 中Concurrency::array?当循环开始时它们是否再次被复制parallel_for_each,或者我的显卡是否以某种方式使用了 RAM 中的数据?如果我使用array_view而不是array- 那会保存副本吗?

标签: c++c++-amp

解决方案


据我所知,当您声明数组并对其进行初始化时,有一次从 CPU 到 GPU 的传输。

然后您可以在 GPU 端(在 parallel_for_each 循环内)自由使用它。数组不包含数据的自动同步机制,所以我不确定当你在 for 循环中选择一个值时会发生什么。

如果您选择 array_view 数据同步是隐式的。一个副本将在初始化时发生,一个副本将在您选择一个值时将数据从 GPU 带回 CPU。

我向您推荐这篇博文http://www.danielmoth.com/Blog/array-And-Arrayview-From-Amph.aspx甚至是完整的放大器系列。


推荐阅读