假设我有parallel_for_each
连续两次调用的 C++ AMP 代码。第一次调用的所有 lambdas 会在第二次调用的 lambdas 开始之前完成吗?
一般来说,对 lambdas 的执行顺序有什么保证吗?
假设我有parallel_for_each
连续两次调用的 C++ AMP 代码。第一次调用的所有 lambdas 会在第二次调用的 lambdas 开始之前完成吗?
一般来说,对 lambdas 的执行顺序有什么保证吗?
简短回答:不,lambda 通常不会完成。
更长的答案:parallel_for_each 将请求排队到 GPU,然后您的 CPU 线程继续到第二个 parallel_for_each 并将其排队,然后您的 CPU 线程继续执行其他 CPU 代码。同时,以非确定性的方式,计算将在您将它们排队的加速器上执行(如果在默认加速器上,第一个计算将执行,然后第二个计算将执行)。在计算执行之间,或者甚至在两次计算之后,如果在任何时候您尝试访问任何计算的结果,那么 CPU 线程将在等待结果被复制回来时阻塞(如果有必要等待执行完成)。
如果您只想等待计算完成(不触发返回副本),请在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
您可以使用并发可视化工具自己回答这个问题。如果您使用的是队列视图,则两个 pfe 都可能认为自己已完成(它们不会阻塞,它们会返回),而代码尚未在 GPU 上运行。如果您想确保第一个已经完成,请以某种方式使用其结果(例如将数组复制回 CPU 或使用 array_view),这将使代码开始在加速器上运行。
如果您在发送第二个 pfe 之前不触摸/询问第一个 pfe 的结果,您为什么要保证运行顺序?如果您确实触摸或询问结果,那就是控制事情执行方式的因素。