8.2 C++ AMP advanced concepts

C++ AMP一些更高级的概念:

1. device内存的分配和拷贝.

void vecAdd(float* A, float* B, float* C, int n)
{
  array<float,1> AA(n), BA(n);
  array<float,1> CA(n);
  copy(A,AA);
  copy(B,BA);
  parallel_for_each(CA.get_extent(),
  [&AA,&BA,&CA](index<1> i) restrict(amp)
  {
    CA[i] = AA[i] + BA[i];
  });
  copy(CA,C);
}

array<T,Dimesion>的作用是分配 Accelerator memory,类似于cudaMalloc().

copy(source,destination)的作用是拷贝内存动作,可以在host和Accelerator之间来回拷贝,类似于cudaMemcpy().

这两者加起来的功能就是array_view<>.

另外注意到执行完kernel计算后,拷贝CA数据回host C, 但是并没有执行CV.synchronize()动作,其实copy有隐式同步的功能.

2. host和accelerator异步执行

上面的代码host和accelerator的执行顺序如下图:(左边的是host,右边的是accelerator)

accelerator设备在执行compute的时候,host可以同时执行其他的动作,比如下面的代码:

  parallel_for_each(CA.get_extent(),
  [&AA,&BA,&CA](index<1> i) restrict(amp)
  {
    CA[i] = AA[i] + BA[i];
  });
  completion_future done = CV.synchronize_async();
  otherProcessing(A,B);
  done.get();

completion_future done关联CV的操作. done.get()等待,直到关联的异步操作完成为止.

这个代码的执行顺序图如下:

可以看到,在accelerator执行计算的时候,cpu在执行otherProcessing().

 

 

posted @ 2015-03-24 17:52  Magnum Programm Life  阅读(323)  评论(0编辑  收藏  举报