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().