Используйте synchronize (), когда вы хотите получить доступ к данным без , проходящего через интерфейс array_view. Если весь ваш доступ к данным использует операторы и функции array_view, вам не нужно использовать synchronize (). Как упоминал Даниэль, деструктор array_view также вызывает синхронизацию, и в этом случае лучше вызывать synchronize (), чтобы вы могли получить любые исключения, которые могут быть выброшены.
Функция синхронизации заставляет обновить буфер в контексте вызова - то есть, если вы записываете данные в графический процессор, а затем вызываете синхронизацию в коде процессора, в этот момент обновленные значения копируются в Память процессора.
Это кажется очевидным из названия, но я упоминаю об этом, потому что другие операции array_view также могут вызывать синхронизацию. C ++ AMP array_view старается сделать так, чтобы копирование между процессором и памятью GPU оказало влияние - любая операция, которая читает данные через интерфейс представления массива, также приведет к копированию.
std::vector<int> v(10);
array_view<int, 1> av(10, v);
parallel_for_each(av.grid, [=](index<1> i) restrict(direct3d) {
av[i] = 7;
}
// at this point, data isn't copied back
std::wcout << v[0]; // should print 0
// using the array_view to access data will force a copy
std::wcout << av[0]; // should print 7
// at this point data is copied back
std::wcout << v[0]; // should print 7