kernel launch请教

zaviichen 2010-02-02 04:47:40
我想用GPU进行电路仿真,目前遇到kernel的划分问题想请教大家。

如果电路已经被分为n层,在进行GPU计算的时候,是选择对于每一层电路Launch一次kernel,还是只Launch一次Kernel,在这个kernel中计算整个电路结构?

如果采用每层Launch一次的话,这样不断开启kernel开销会不会很大啊?而且每一次在launch kernel的同时还要再进行数据拷贝。如果只launch一次的话,就要传输大量数据,而且在控制上也不是很方便,比如何时读出计算结果。

谢谢!
...全文
388 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
用cudaMemcpyAsync函数.
详细的看<<编程手册>>第4.5.2.4节流管理.
例子是sdk中的src\asyncAPI.

程序结构应该是:
cudaMemcpy(*a,...);// 0层参数
for(i=0; i <n-1; i++){
kernel < < < >>> (a,...);// i层
cudaMemcpyAsync(*a,...);// i+1层参数
// 等待kernel结束
// 等待cudaMemcpyAsync结束
}
kernel < < < >>> (a,...);// n-1层
cudaMemcpy(*r,...);// 最后结果
zaviichen 2010-02-03
  • 打赏
  • 举报
回复
现在我的方法碰到了一个问题,可以麻烦你看看我的另一个帖子《__syn同步出错》中有详细的描述,我是希望经过n次kernel调用后才会计算出结果,毕竟上下次的kernel计算有数据依赖关系。但实际上好像一次kernel的调用就把所有问题给解决了。。。我就不明白为什么n+1层的计算结果依赖于n层,比如这次调用就计算第n层,但是同时还能计算出n+1层的正确结果。就像CPU的串行运算那样,很莫名。。。
  • 打赏
  • 举报
回复
另外,如果LZ的线路不复杂的话,可以尝试1个kernel同时模拟独立的i层.
  • 打赏
  • 举报
回复
启动时间0.1ms左右.基本固定.和数据量无关.
zaviichen 2010-02-03
  • 打赏
  • 举报
回复
非常感谢,不过好像这样的话各层的kernel还是必须顺序执行,异步执行只能掩盖数据延时。我看了国外的官方论坛,好像启动一次kernel差不多要15us,启动时间和线程的数量,还有需要传输的数据量大小有关系吗?
zaviichen 2010-02-02
  • 打赏
  • 举报
回复
我一开始也是倾向第一种方法,但是我两种方法都尝试过,好像一次一层的方法会比只启动一次kernel的方法慢上50倍。。。

我大致的调用结构是这样的:

for(i=0; i<n; i++){
cudaMemcpy(*a,...);
kernel<<< >>> (a,...);
}

在循环中不断的拷贝数据,然后启动新的一层电路的kernel。

弱弱地问一下,怎么实现“在计算本层的结果同时异步上传下层的参数”,能用一些伪代码表示一下吗?

谢谢!
  • 打赏
  • 举报
回复
一次一层.在计算本层的结果同时异步上传下层的参数.两层之间的中间结果直接保存在gmem(显存)中,不用再上下传.只下传最后结果.
  • 打赏
  • 举报
回复
不太了解具体情况,但总觉得分开kernel比较好。

353

社区成员

发帖
与我相关
我的任务
社区描述
CUDA高性能计算讨论
社区管理员
  • CUDA高性能计算讨论社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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