CUDA里如何多GPU独立工作?

  • 3 replies
  • 613 views
CUDA里如何多GPU独立工作?
« 于: 九月 10, 2021, 11:03:19 am »
需求是在使用不同的主机线程,可同时在不同的GPU执行完全不同的任务;
现在疑问的是:
1)cudaSetDevice虽然线程安全,但这样的每次执行显存分配,核函数前都设置下,还要在主机端加锁,防止多线程间弄串;
2)使用stream可以实现两线程独立的任务处理,但仅在相同显卡下有效,使用不同显卡依然要面临1)中cudaSetDevice的调用问题;
3)使用driver API,这样有了显式控制的上下文,整个操作就类似OpenCL了,但这样是不是过于复杂,能driver API和CUDA Runtime API混合调用吗?
求[名词6]给给建议

Re: CUDA里如何多GPU独立工作?
« 回复 #1 于: 九月 13, 2021, 02:19:21 pm »
需求是在使用不同的主机线程,可同时在不同的GPU执行完全不同的任务;
现在疑问的是:
1)cudaSetDevice虽然线程安全,但这样的每次执行显存分配,核函数前都设置下,还要在主机端加锁,防止多线程间弄串;
2)使用stream可以实现两线程独立的任务处理,但仅在相同显卡下有效,使用不同显卡依然要面临1)中cudaSetDevice的调用问题;
3)使用driver API,这样有了显式控制的上下文,整个操作就类似OpenCL了,但这样是不是过于复杂,能driver API和CUDA Runtime API混合调用吗?
求[名词6]给给建议

(1) 请不要看老的资料: 首先cudaMalloc*()是线程间安全的,kernel的launch也是线程间安全的,没必要用锁来保护一段cudaMalloc或者启动kernel的代码。
(2) 我没看懂你的第二句话。多张卡上的多个流同样可以独立执行的。也不需要特殊的锁之类的保护某个片段。
(3) 可以。手册有,请看手册。

Re: CUDA里如何多GPU独立工作?
« 回复 #2 于: 九月 13, 2021, 05:21:34 pm »
(1) 请不要看老的资料: 首先cudaMalloc*()是线程间安全的,kernel的launch也是线程间安全的,没必要用锁来保护一段cudaMalloc或者启动kernel的代码。
(2) 我没看懂你的第二句话。多张卡上的多个流同样可以独立执行的。也不需要特殊的锁之类的保护某个片段。
(3) 可以。手册有,请看手册。
嗯,关于(3)已经查看了资料,可以用;
关于(1),我纠结的是操作系统在调度主线线程时,对应的CUDA上下文是不是能自动的切换,测试过了,是会自动切换。
Mark下:
执行需要的功能前,cudaSetDevice()就行,不用担心在这个过程后,被其他线程设置使用另一个设备而破坏。

Re: CUDA里如何多GPU独立工作?
« 回复 #3 于: 九月 13, 2021, 07:01:19 pm »
嗯,关于(3)已经查看了资料,可以用;
关于(1),我纠结的是操作系统在调度主线线程时,对应的CUDA上下文是不是能自动的切换,测试过了,是会自动切换。
Mark下:
执行需要的功能前,cudaSetDevice()就行,不用担心在这个过程后,被其他线程设置使用另一个设备而破坏。

没太看懂你的意思?是我的中文水平下降了么。。。

你是想说每个线程要维持一个隐式的当前设备编号状态么?直接开N个线程,每个线程永恒的对应1个卡不就得了。