背景:有关 C++ AMP 概述,请参阅 Daniel Moth 的 recent BUILD talk .
完成初始演练 here , here , here , 和 here .
只有在最后一个引用中,他们才会调用 array_view.synchronize()
。
在这些简单的示例中,不需要调用 synchronize()
吗?什么时候排除是安全的?我们能否相信 parallel_for_each 在没有它的情况下“同步”运行(w/r/t 后续代码)?
最佳答案
当您想不通过array_view 接口(interface)访问数据时,请使用synchronize()。如果您对数据的所有访问都使用 array_view 运算符和函数,则不需要使用 synchronize()。正如 Daniel 提到的,array_view 的析构函数也会强制执行同步,在这种情况下最好调用 synchronize(),这样您就可以获得可能抛出的任何异常。
同步函数强制在调用上下文中对缓冲区进行更新——也就是说,如果您在 GPU 上写入数据,然后在 CPU 代码中调用同步,此时更新的值将被复制到 CPU 内存。
从名字上看这似乎很明显,但我提到它是因为其他 array_view 操作也可能导致“同步”。 C++ AMP array_view 尽力使 CPU 和 GPU 内存之间的复制隐含——任何通过数组 View 接口(interface)读取数据的操作也会导致复制。
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
关于c++ - 在 C++ AMP 中什么时候不需要调用 "synchronize()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510415/