关于内存拷贝和线程异步执行的优化

swipall 2014-03-17 04:59:45
在opencl里面,可以实现内存拷贝和线程异步执行的优化(Overlap of Data Transfer and Kernel Execution)吗?如果可以,该怎么做呢?

...全文
956 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
outstander 2014-03-19
  • 打赏
  • 举报
回复
另外,overlap实际上在循环中运用的最多比如有2维数组A[m][n],每次循环处理一个维度时可以这么写 阻塞传输A[0] for(int i=0;i<m;i++) { if(i<m-1) 非阻塞传输A[i+1]; 计算A[i]; clfinish(); (计算A[i]和传输A[i+1]将同时进行) }
outstander 2014-03-19
  • 打赏
  • 举报
回复
OpenCL中对于kernel启动和数据传输的API均有两种模式:阻塞模式和阻塞模式,利用这两种模式的API可以完成数据传输的overlap。 所谓阻塞模式,是指CPU端启动kernel计算或数据传输后会等计算或传输完成后再执行后面的指令。 而非阻塞模式则相反,CPU启动了计算或传输后就直接执行后面的CPU指令,将不等待计算或传输完成。 因此假设要掩盖B数据传输时间可以这么写: 1.阻塞发起A 数据传输(阻塞是为了确保计算时数据就位) 2.非阻塞发起B数据传输 3.发起对A数据的计算(此时计算与数据传输同时进行) 4.clfinish (确保B数据传输和A数据计算完成) 5.发起对B数据的计算

602

社区成员

发帖
与我相关
我的任务
社区描述
异构开发技术
社区管理员
  • OpenCL和异构编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧