У меня есть проблема, которую я хочу разделить между несколькими устройствами CUDA, но я подозреваю, что моя текущая архитектура системы сдерживает меня;
Я настроил класс GPU с функциями, которые выполняют операции на GPU (странно, что).Эти операции выполняются в стиле
for iteration in range(maxval):
result[iteration]=gpuinstance.gpufunction(arguments,iteration)
Я представлял, что для N устройств будет N gpuinstances, но я не знаю достаточно о многопроцессорной обработке, чтобы увидеть самый простой способ применения этого, чтобы каждое устройствоназначается асинхронно, и, как ни странно, несколько примеров, с которыми я сталкивался, давали конкретные демонстрации сопоставления результатов после обработки.
Может кто-нибудь дать мне какие-либо указатели в этой области?
ОБНОВЛЕНИЕ Спасибо, Калоян, за ваше руководство в области многопроцессорности;если бы CUDA не был именно тем камнем преткновения, я бы пометил вас как ответившего.Сожалею.
Очевидно, что для игры с этой реализацией класс gpuinstance инициировал устройство CUDA с import pycuda.autoinit
Но это не сработало, выдавая ошибки invalid context
, как только каждый (правильно распределенный) поток встречал cudaкоманда.Затем я попытался инициализировать вручную в конструкторе __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
)
Проблема в том, что invalid context
исключения все еще появляются, как только поток пытается коснуться CUDA.
Есть идеи, ребята?И благодаря этому далеко.Автоматические отклики для людей, работающих «банан» в свой ответ!: P