将array_view.sync_asynch 等待parallel_for_each完成
will array_view.synchronize_asynch wait for parallel_for_each completion?
如果我在concurrency::parallel_for_each
循环中操作concurrency::array_view
,我的理解是我可以在循环执行时继续在CPU上执行其他任务:
using namespace Concurrency;
array_view<int> av;
parallel_for_each(extent<1>(number),[=](index<1> idx)
{
// do some intense computations on av
}
// do some stuff on the CPU while we wait
av.synchronize(); // wait for the parallel_for_each loop to finish and copy the data
但是,如果我想不等待并行 for 循环,而是尽快开始从 GPU 复制数据怎么办。以下方法是否有效?
using namespace Concurrency;
array_view<int> av;
parallel_for_each(extent<1>(number),[=](index<1> idx)
{
// do some intense computations on av
}
// I know that we won't be waiting to synch when I call this, but will we be waiting here
// until the data is available on the GPU end to START copying?
completion_future waitOnThis = av.synchronize_asynch();
// will this line execute before parallel_for_each has finished processing, or only once it
// has finished processing an the data from "av" has started copying back?
completion_future.wait();
我在《飞蛾》上读到了这个话题,但在阅读以下内容后,我并没有真正明智:
请注意,parallel_for_each执行时好像与 调用代码,但实际上它是异步的。即一旦 parallel_for_each调用,内核已传递给 运行时,some_code_B区域继续执行 CPU 线程,而内核并行由 GPU 执行 线程。但是,如果您尝试访问(数组或array_view)数据 您在 some_code_B 区域的 lambda 中捕获的代码 将阻止,直到结果可用。因此正确的 语句:parallel_for_each在以下方面是同步的 可见的副作用,但实际上是异步的。
我不喜欢这种解释方式。更好的考虑方法是parallel_for_each
队列对 GPU 起作用,因此它几乎立即返回。在排队的工作完成之前,CPU 端代码可以通过多种方式进行阻塞,例如,显式调用 synchronize
或从parallel_for_each
中使用的array_view
实例之一访问数据
using namespace concurrency;
array_view<int> av;
parallel_for_each(extent<1>(number),[=](index<1> idx)
{
// Queue (or schedule if you like) some intense computations on av
}
主机代码现在可以执行。AMP 计算可能已经开始,也可能尚未开始。如果这里的代码访问av
那么它将阻塞,直到 GPU 上的工作完成并且av
中的数据已经写入并且可以与主机内存同步。
这是一个未来,所以它也是一个预定的任务。不保证在任何特定点执行。如果它被调度,那么它将阻塞它正在运行的线程,直到av
与主机内存正确同步(如上所述)。
completion_future waitOnThis = av.synchronize_asynch();
可以在此处执行更多主机代码。如果主机代码访问av
则它将阻塞,直到parallel_for_each
完成(如上所述)。在某个时候,运行时将执行将来和阻塞,直到av
与主机内存同步。如果它是可写的并且已被更改,那么它将被复制回主机内存。
completion_future.wait();
对wait
的调用将阻止,直到将来完成(在调用wait
之前,不能保证任何内容已实际执行)。此时,您可以保证 GPU 计算已完成,并且可以在 CPU 上访问av
。
话虽如此,增加waitOnThis
未来似乎使事情过于复杂。
array_view<int> av;
parallel_for_each(extent<1>(number),[=](index<1> idx)
{
// do some intense computations on av on the GPU
}
// do some independent CPU computation here.
av.synchronize();
// do some computation on the CPU that relies on av here.
MSDN 文档在这个主题上不是很好。下面的博客文章更好。在同一博客上的异步 API 上还有其他一些帖子。
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- 函数中的"pragma omp parallel for"在另一个并行循环中调用函数时无效
- C++ + OpenMP for Parallel Computing:如何在Visual Studio中进行设置
- Parallel for with omp
- OpenMP:'parallel for loop'瓶颈
- 简单将 OpenMp Parallel for 转换为 C# Parallel for
- Parallel of std::reference_wrapper for std::shared_ptrs
- OpenMP 'parallel for'预先初始化
- omp parallel for:如何让线程写入私有数组,并在所有线程完成处理后合并所有数组
- OpenMP "master"杂注不得被"parallel for"杂注包围
- C++ Break omp parallel for
- OpenMP "parallel for"在特定程序中很奇怪
- 用OpenMP(Parallel for)并行化时分割错误