2013-07-24 2 views
0

Я использую CUDA на двойной системе GPU с использованием карт NVIDIA GTX 590, и у меня есть массив, разбитый по фигуре ниже.Разделение массива на систему с несколькими GPU и передача данных по различным графическим процессорам

Если я собираюсь использовать CudaSetDevice(), чтобы разделить суб-массивы по графическим процессорам, они будут использовать одну и ту же глобальную память? Может ли первое устройство получить доступ к обновленным данным на втором устройстве, и если да, то каким образом?

спасибо. enter image description here

ответ

1

Каждая память устройства отдельно, так что, если вы звоните cudaSetDevice(A), а затем cudaMalloc() то вы выделения памяти на устройстве A. Если впоследствии получить доступ к этой памяти из устройства B, то вы будете иметь более высокую латентность доступа, поскольку доступ есть для перехода через внешнюю ссылку PCIe.

Альтернативной стратегией было бы разделение результата на графических процессорах и сохранение всех входных данных, необходимых для каждого графического процессора. Это означает, что у вас есть дублирование данных, но это обычная практика в программировании с использованием графического процессора (и даже любого параллельного метода, такого как MPI) - вы часто слышите термин «ореол», применяемый к областям данных, которые необходимо переносить между обновлениями.

Обратите внимание, что вы можете проверить, может ли одно устройство получить доступ к другой памяти с помощью cudaDeviceCanAccessPeer(), в случаях, когда у вас есть карта с двумя GPU, это всегда так.

+0

Я бы сказал, что в утвердительном случае вы можете использовать 'cudaMemcpyPeer()', который не должен включать временную память CPU и, следовательно, должен ускорить передачу памяти с одного GPU на другой. Это правильно? – JackOLantern

+0

Если у вас есть единая виртуальная адресация (64-разрядная, sm_20 и более поздняя), вы можете просто использовать 'cudaMemcpy()', но в противном случае да, вы можете использовать 'cudaMemcpyPeer()', чтобы избежать лишнего перескока в передаче. – Tom

+0

Спасибо за головы! :) – Leon