PyCUDA;如何动态分配工作负载到多个设备
PyCUDA虽然有一些缺点,但通常会提供很好的示例,大家可以在wiki上下载到。不过,我在这些示例和文档中(还有简单的谷歌搜索)找不到关于如何动态分配工作到多个设备的PyCUDA方法。
有没有人能给我一些提示,或者指向一些相关的示例呢?
我脑海中闪过一个主意,就是使用多进程,生成一个N个进程的池,每个进程对应一个设备。然后当调用这个类的时候(我把所有的GPU函数放在一个单独的类里;可能不是最好的主意,但能用),就轮流使用这些多进程。这个主意怎么样?是个好主意还是傻主意?
另外,我的开发机器只有1个GPU,而我的测试机器有4个GPU,所以我需要一个能处理动态设备数量的解决方案(而且它们的计算能力也不同,这也是没办法的事)。
1 个回答
2
Pycuda 之前没有支持多个GPU的功能,因为CUDA本身也没有这个功能。不过在CUDA 4.0版本中,这种情况会有所改变,因为它的接口(API)进行了更新,可以安全地处理多线程和多个GPU。但据我所知,Pycuda 还没有跟上这个变化。即使将来支持了,每个设备仍然需要你自己去管理,工作负载也需要你来分配。也就是说,没有自动分配工作负载的功能。
对于多个GPU的使用,我通常会用mpi4py。你也可以考虑使用多线程的Python方案,让每个线程在Pycuda中打开一个独立的上下文。究竟哪种方法效果最好,可能还得看设备之间需要多少通信。