8.2 C++ AMP advanced concepts
2024-09-25 22:38:54
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().
最新文章
- qt中添加Q_OBJECT报错的问题
- Python 学习---------Day2
- 【C语言学习】《C Primer Plus》第8章 字符输入/输出和输入确认
- [ZigBee] 10、ZigBee之睡眠定时器
- SQLserver游标原理和使用方法
- ubuntu安装hudson
- Azure Backup 入门
- 线段树(单点更新)HDU1166、HDU1742
- PHP学习笔记三十七【http】
- My97DatePicker使用的问题
- linux tcp重传多会导致软中断在各个核很不均匀么?
- .net core+Spring Cloud学习之路 一
- 使用COM打开Excel文档注意事项
- 《剑指offer》 数值的整数次方
- Jquery 点击事件重复获取叠加 (一)
- Ubuntu上latex+atom配置
- NET设计模式 第二部分 结构性模式(8):桥接模式(Bridge Pattern)
- 新建WebAPI项目时遇到的问题
- 【RF库XML测试】通过xpath查找元素的说明
- [调试][程序打印]当printf不能用时,使用C++的不定参数来搞定OutputDebugString打印
热门文章
- [转载]HTML5 Audio/Video 标签,属性,方法,事件汇总
- The 11th Zhejiang Provincial Collegiate Programming Contest->;Problem G:G - Ternary Calculation
- hdu 4649 Professor Tian 反状态压缩+概率DP
- hdu 4652 Dice 概率DP
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)
- Armitage主屏幕说明与命令行启动
- Java对象相关元素的初始化过程
- fedora
- JBoss7 局域网无法访问 解决方法
- 在Ubuntu 12.04安装和设置SSH服务