多线程调用GPU问题

  • 3 replies
  • 74 views
多线程调用GPU问题
« 于: 九月 10, 2019, 08:44:26 am »
目的是将GPU上的实现的功能封装成库对外调用,用多线程时发现时间反而变长,更像是顺序执行的,用nvvp查看,多线程调用的cuda函数耗时比较长。感觉一个context上的调用都是顺序执行。
先请教前辈这方面的经验,是不是不支持多线程调用。

Re: 多线程调用GPU问题
« 回复 #1 于: 九月 10, 2019, 10:21:43 pm »
目的是将GPU上的实现的功能封装成库对外调用,用多线程时发现时间反而变长,更像是顺序执行的,用nvvp查看,多线程调用的cuda函数耗时比较长。感觉一个context上的调用都是顺序执行。
先请教前辈这方面的经验,是不是不支持多线程调用。

没有必要一个host线程对应一个CUDA Context的,你完全可以多个Host线程共享1个CUDA Context, 然后用Stream隔离开前后依赖关系:

(1)这样多线程调用的时候并不会引入context切换的开销。
(2)是否特定的卡可以多个context并发的执行,目前无资料。

注意多个host线程共享1个CUDA Context,是目前使用Runtime API情况时候的默认处理状态。

Re: 多线程调用GPU问题
« 回复 #2 于: 九月 11, 2019, 02:48:46 pm »
下图里4个host线程,每个线程里创建一个stream,期望是每个线程的内存拷贝顺序执行,和kernel可以overlap。
但从nvvp图上看,各线程的memcpy和launchKernel相互影响,虽然stream1的拷贝完成了,但kernel并没能跟着执行。
我猜测是cuda的调用内部有锁机制,一个context里的cuda调用还是顺序执行的,这样的话多个host线程的意义不大。
[/size]测试总体时间基本是4倍的单线程时间。

Re: 多线程调用GPU问题
« 回复 #3 于: 九月 11, 2019, 09:32:01 pm »
下图里4个host线程,每个线程里创建一个stream,期望是每个线程的内存拷贝顺序执行,和kernel可以overlap。
但从nvvp图上看,各线程的memcpy和launchKernel相互影响,虽然stream1的拷贝完成了,但kernel并没能跟着执行。
我猜测是cuda的调用内部有锁机制,一个context里的cuda调用还是顺序执行的,这样的话多个host线程的意义不大。
[/size]测试总体时间基本是4倍的单线程时间。

你这缺少太多的信息了,例如:
(1)是否使用Windows?如果是,是否是专业卡驱动(TCC驱动?),普通WDDM驱动将限制可能的一次或者多次overlap

(2)传输是否使用了page-locked memory? 只有page-locked memory才会可能会kernel交叠。

等等。请补充。