2011-09-22 65 views
3

背景:有关C++ AMP的概述,请参阅Daniel Moth的recent BUILD talk何时调用C++ AMP中不需要的“同步()”?

通过初步演练here,here,herehere

只有在最后的参考文献中,他们才会打电话给array_view.synchronize()

在这些简单的例子中,是不是需要拨打synchronize()?什么时候排除是安全的?我们可以相信parallel_for_each在没有它的情况下表现“同步”(w/r/t前面的代码)吗?

+0

通过什么我需要尝试C++ AMP的方式;我正在使用VS 2010? –

+0

我选择使用VS 2011 –

+0

现在我得到“runtime_exception:无法创建缓冲区”。堆栈跟踪显示“vcamp110d.dll!Concurrency :: details :: _ Buffer :: _ Create_buffer(...” –

回答

10

使用同步()当您要访问的数据通过的array_view接口去。如果您对数据的所有访问都使用array_view运算符和函数,则不需要使用synchronize()。正如Daniel提到的那样,array_view的析构函数也会强制进行同步,在这种情况下最好调用synchronize(),以便可以获取可能抛出的任何异常。

的同步功能力量更新到主叫范围内的缓冲 - 也就是说,如果你写在GPU上的数据,然后调用CPU代码同步,在这一点上更新的值复制到CPU内存。

这看起来很明显,但我提到它,因为其他array_view操作也会导致“同步”。 C++ AMP array_view尽力在CPU和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 
+0

谢谢!这就说得通了。接下来的问题是关于并发性 - 如果两个“parallel_for_each”操作在代码中按顺序分派,那么我们能否依靠在第二个开始之前完成的第一个计算?也许这对于一篇新文章来说是一个很好的话题 - 我会尝试通过API获得更多的经验来制定一个或两个好的问题。 –

1

我敢打赌,排除是不安全的,因为在多线程(并行或并行)中,假设任何事情都是不安全的。某些结构给你提供了某些保证,但你必须非常谨慎和细致,不要通过引入你认为可以做的事情来打破这些保证,但是实际上在整个事情中存在很多复杂性。还没花任何时间用C++ - AMP,但我倾向于尝试一下。

+0

感谢您的想法(以及新的C++ -AMP标记)。 –

+1

另一种显示接受答案的方法是对他们进行投票;) –

4

我显示的简单示例不需要my_array_view_instance.synchronize,因为析构函数调用同步。话虽如此,我并没有遵循最佳实践(抱歉),即明确调用同步。原因是,如果在此时抛出任何异常,如果将它们留给析构函数,则不会观察它们,因此请明确调用同步。

干杯

丹尼尔

3

只注意到在您的文章有关parallel_for_each是同步VS asyncrhonous(对不起,我习惯了每个线程;-) 1个问题:“我们能相信parallel_for_each的行为‘同步’,没有它的第二个问题(W/r/t程序代码)?“

这个问题的答案是在我的岗位约parallel_for_each: http://www.danielmoth.com/Blog/parallelforeach-From-Amph-Part-1.aspx

..而且在BUILD记录你指出,从29:20-33:00 http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-802T

概括地说,不,你不能相信它是同步的,这是asyncrhonous。 (隐式或显式)同步点是任何试图访问由于并行循环而预期将从GPU复制的数据的代码。

干杯

丹尼尔