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

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

void vecAdd(float* A, float* B, float* C, int n)
{
array<float,> AA(n), BA(n);
array<float,> CA(n);
copy(A,AA);
copy(B,BA);
parallel_for_each(CA.get_extent(),
[&AA,&BA,&CA](index<> 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<> 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().

最新文章

  1. qt中添加Q_OBJECT报错的问题
  2. Python 学习---------Day2
  3. 【C语言学习】《C Primer Plus》第8章 字符输入/输出和输入确认
  4. [ZigBee] 10、ZigBee之睡眠定时器
  5. SQLserver游标原理和使用方法
  6. ubuntu安装hudson
  7. Azure Backup 入门
  8. 线段树(单点更新)HDU1166、HDU1742
  9. PHP学习笔记三十七【http】
  10. My97DatePicker使用的问题
  11. linux tcp重传多会导致软中断在各个核很不均匀么?
  12. .net core+Spring Cloud学习之路 一
  13. 使用COM打开Excel文档注意事项
  14. 《剑指offer》 数值的整数次方
  15. Jquery 点击事件重复获取叠加 (一)
  16. Ubuntu上latex+atom配置
  17. NET设计模式 第二部分 结构性模式(8):桥接模式(Bridge Pattern)
  18. 新建WebAPI项目时遇到的问题
  19. 【RF库XML测试】通过xpath查找元素的说明
  20. [调试][程序打印]当printf不能用时,使用C++的不定参数来搞定OutputDebugString打印

热门文章

  1. [转载]HTML5 Audio/Video 标签,属性,方法,事件汇总
  2. The 11th Zhejiang Provincial Collegiate Programming Contest-&gt;Problem G:G - Ternary Calculation
  3. hdu 4649 Professor Tian 反状态压缩+概率DP
  4. hdu 4652 Dice 概率DP
  5. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)
  6. Armitage主屏幕说明与命令行启动
  7. Java对象相关元素的初始化过程
  8. fedora
  9. JBoss7 局域网无法访问 解决方法
  10. 在Ubuntu 12.04安装和设置SSH服务