c++ - 在 C++ AMP 中什么时候不需要调用 "synchronize()"?

标签 c++ c++-amp

背景:有关 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/

相关文章:

c++ - vector 可以包含一个重载运算符 & 的智能指针吗?

c++ - 如何在 OS X 10.6 上针对 OS X 10.4u SDK 构建 boost 库和其他库?

c++ - 我可以显式调用 restrict(amp) callable 以确保它在加速器上运行吗

c++ - 如何在 C++ AMP 中同步线程?

c++ - 配置文件应该放在哪里?

c++ - 如何在缩放期间禁用 mouseEvent?

C++ AMP 在硬件上崩溃 (GeForce GTX 660)

c++ - 已部署的 C++ AMP 应用程序停止响应

c++ - parallel_for_each 出现不支持的类型错误

c++ - 找不到 opencv_highgui230.dll