从多个parallel_for_each调用执行lambdas的顺序

时间:2012-05-01 16:18:30

标签: c++-amp

假设我有连续两次parallel_for_each次调用的C ++ AMP代码。第一次调用的所有lambda都会在第二次调用的lambdas开始之前完成吗?

一般来说,是否有关于lambdas执行顺序的保证?

2 个答案:

答案 0 :(得分:3)

简短回答:不,lambda通常不会完成。

更长的答案:parallel_for_each将请求排队到GPU,然后你的CPU线程继续到第二个parallel_for_each并排队,然后你的CPU线程继续执行其他CPU代码。与此同时,以非确定性的方式,计算将在您排队的加速器上执行(如果在默认加速器上,第一个计算将执行,然后第二个计算将执行)。在执行计算之间,或者甚至在两次计算之后,如果在任何时候你试图访问任何计算的结果,那么CPU线程将在等待结果被复制时阻塞(如果需要,等待执行完成)。一种方法是通过在传递给p_f_e的lambda中捕获的输出array_view对象之一上调用synchronize。

如果您只想等待计算完成(不触发副本),请在accelerator_view上调用wait。

顺便说一下,您不必管理不同parallel_for_each调用之间的数据依赖关系。底层运行时为您执行此操作。因此可以在相应的parallel_for_each调用中使用相同的array_View,并且数据将为第二个调用准备就绪,而无需返回主机CPU。

如果您仍然不清楚这一点,请分享重新编码,以便我们更具体。

要了解有关C ++ AMP的更多信息,请从此处开始: http://blogs.msdn.com/b/nativeconcurrency/archive/2011/09/13/c-amp-in-a-nutshell.aspx

答案 1 :(得分:1)

您可以使用并发可视化工具自己回答这个问题。如果您正在使用排队视图,则可能两个pfes都会认为自己已完成(它们不会阻塞,它们返回),而代码尚未在GPU上运行。如果你想确定第一个完成,以某种方式使用它的结果(例如将数组复制回CPU或使用array_view),这将使代码开始在加速器上运行。

如果您在发送第二个pfe之前没有触摸/询问第一个pfe的结果,为什么还要保证运行顺序?如果你触摸或询问结果,那就是控制事情执行方式的原因。