【发布时间】:2018-05-29 14:16:09
【问题描述】:
我遇到了一个问题,我想在多个 CUDA 设备上拆分,但我怀疑我当前的系统架构阻碍了我;
我设置的是一个 GPU 类,具有在 GPU 上执行操作的函数(奇怪)。这些操作都是风格
for iteration in range(maxval):
result[iteration]=gpuinstance.gpufunction(arguments,iteration)
我原以为 N 个设备会有 N 个 gpuinstances,但我对多处理了解得不够多,无法看到应用此功能的最简单方法,以便异步分配每个设备,而且奇怪的是我的示例很少遇到了处理后的整理结果的具体演示。
谁能给我这方面的任何指点?
更新 感谢 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 异常仍然会出现。
大家有什么想法吗?感谢能走到这一步。自动为“香蕉”工作的人投票! :P
【问题讨论】:
-
gpuinstance.gpufunction(arguments,iteration)是异步的还是会阻塞执行?
标签: python cuda parallel-processing multiprocessing pycuda