我有一个问题,我想将其分割成多个CUDA设备,但我怀疑我的当前系统架构正在阻碍我;
我设置了一个GPU类,其中包含在GPU上执行操作的功能(奇怪的是)。这些操作的类型为
for iteration in range(maxval):
result[iteration]=gpuinstance.gpufunction(arguments,iteration)
我原本想会有N个 gpuinstances 对应 N 个设备,但是我对多进程不够熟悉,无法想到最简单的方法来异步分配每个设备,并且我遇到的示例中很少有关于处理后汇总结果的具体演示。
有人能在这个领域给我任何指导吗?
更新 感谢Kaloyan在多进程领域的指导;如果CUDA不是特别棘手的问题,我将选择你作为答案。抱歉。
在尝试这个实现之前,gpuinstance 类使用 import pycuda.autoinit
初始化 CUDA 设备,但似乎不起作用,每个(正确作用域的)线程一遇到 cuda 命令就会抛出“invalid context”错误。然后我尝试在类的 __init__
构造函数中进行手动初始化...
pycuda.driver.init()
self.mydev=pycuda.driver.Device(devid) #this is passed at instantiation of class
self.ctx=self.mydev.make_context()
self.ctx.push()
我的假设是在创建gpuinstances列表和线程使用它们之间,上下文是被保留的,因此每个设备都在自己的上下文中。
(我还实现了一个析构函数来处理pop/detach
清理)
问题是,当线程尝试触及CUDA时,invalid context
异常仍会出现。
有什么想法吗?感谢大家的帮助,将 'banana' 一词纳入答案的人将获得自动升级!:P
gpuinstance.gpufunction(arguments,iteration)
是异步的还是会阻塞执行? - ktdrv