Я работаю над проектом, в котором я распределяю вычислительные задачи по нескольким процессам Python, каждый из которых связан со своим собственным устройством CUDA.
При создании подпроцессов я использую следующий код:
import pycuda.driver as cuda
class ComputeServer(object):
def _init_workers(self):
self.workers = []
cuda.init()
for device_id in range(cuda.Device.count()):
print "initializing device {}".format(device_id)
worker = CudaWorker(device_id)
worker.start()
self.workers.append(worker)
CudaWorker определяется в другом файле следующим образом:
from multiprocessing import Process
import pycuda.driver as cuda
class CudaWorker(Process):
def __init__(self, device_id):
Process.__init__(self)
self.device_id = device_id
def run(self):
self._init_cuda_context()
while True:
# process requests here
def _init_cuda_context(self):
# the following line fails
cuda.init()
device = cuda.Device(self.device_id)
self.cuda_context = device.make_context()
Когда я запускаю этот код в Windows 7 или Linux, у меня нет проблем. При запуске кода на моем MacBook Pro с OSX 10.8.2, Cuda 5.0 и PyCuda 2012.1 я получаю следующую ошибку:
Process CudaWorker-1:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/Users/tombnorwood/pymodules/computeserver/worker.py", line 32, in run
self._init_cuda_context()
File "/Users/tombnorwood/pymodules/computeserver/worker.py", line 38, in _init_cuda_context
cuda.init()
RuntimeError: cuInit failed: no device
У меня нет проблем с запуском сценариев PyCuda без разветвления новых процессов на моем Mac. Я получаю эту проблему только при создании нового процесса.
Кто-нибудь сталкивался с этой проблемой раньше?
fork
, и либо PyCuda, либо сама CUDA опирается на один из них… - person abarnert   schedule 06.02.2013multiprocessing
, которая делает это. (Возможно, когда-нибудь его добавят в магистраль в качестве опции, но он никогда не будет использоваться по умолчанию, потому что это заставит OS Xmultiprocessing
работать больше как Windows, чем как POSIX.) Если вы хотите, и вы не можете его найти или выясните, как сделать это самостоятельно (на самом деле это довольно просто), я могу покопаться в этом. - person abarnert   schedule 06.02.2013multiprocessing.py
из исходников, примените патч, переименуете его во что-то другое, а затем просто вызоветеmymultiprocessing.forking_disable()
прежде всего, это должно сработать. (Патч, возможно, потребует немного помассировать для 2.7, но это не должно быть слишком сложно.) - person abarnert   schedule 06.02.2013