Сколько раз данные копируются в массив 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] << " ";

Сколько раз копируются мои четыре целых числа? Копируются ли они в оперативную память при построении Concurrency::array? Копируются ли они снова, когда начинается цикл parallel_for_each, или моя видеокарта каким-то образом использует данные в оперативной памяти? Что если я использую array_view вместо array - сохранит ли это копию?


person Tommy Herbert    schedule 17.06.2020    source источник


Ответы (1)


Насколько я могу судить, когда вы объявляете массив и инициализируете его, происходит одна передача от ЦП к графическому процессору.

Затем вы можете свободно использовать его на стороне графического процессора (внутри цикла parallel_for_each). Массив не содержит механизма автоматической синхронизации данных, поэтому я не уверен, что происходит, когда вы выбираете значение в цикле for.

Если вы выберете array_view, синхронизация данных будет неявной. Одна копия будет выполняться при инициализации, а другая — для возврата данных из графического процессора в ЦП при выборе значения.

Я рекомендую вам эту запись в блоге http://www.danielmoth.com/Blog/array-And-Arrayview-From-Amph.aspx или даже всю серию по amp.

person Esteban    schedule 26.06.2020
comment
Теперь я считаю, что моя последняя строка кода не содержит копий, поскольку ЦП делит память с ускорителем. Кроме того, я думаю, вы ошибаетесь в том, что данные копируются при инициализации array_view - они копируются в ускоритель специальным образом по мере необходимости, а данные в базовом векторе обновляются до выполнения моей последней строки кода. - person Tommy Herbert; 08.07.2020