У меня есть проблема, что я хочу разделить несколько устройств CUDA, но я подозреваю, что моя нынешняя архитектура системы удерживает меня;
То, что я настроил, - это класс GPU с функциями, которые выполняют операции на графическом процессоре (это странно). Эти операции имеют стиль
for iteration in range(maxval):
result[iteration]=gpuinstance.gpufunction(arguments,iteration)
Я бы предположил, что для N устройств будет N gpuinstances, но я не знаю достаточно о многопроцессорности, чтобы увидеть самый простой способ применения этого, чтобы каждое устройство было асинхронно назначено, и странно мало примеров, которые я натолкнулись на конкретные демонстрации результатов сопоставления после обработки.
Может ли кто-нибудь дать мне какие-либо указатели в этой области?
UPDATE Спасибо Калоян за руководство в плане многопроцессорной области; если бы 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