CUDA: обмен данными между несколькими устройствами? - PullRequest
3 голосов
/ 10 ноября 2010

в Руководстве по программированию CUDA C сказано, что

... по своей сути, хост-поток может выполнять код устройства только на одном устройстве в любой момент времени. Как следствие, для выполнения кода устройства на нескольких устройствах требуется несколько потоков хоста. Кроме того, любые ресурсы CUDA, созданные во время выполнения в одном потоке узла, не могут использоваться средой выполнения из другого потока узла ...

То, что я хотел сделать, - это заставить два графических процессора совместно использовать данные на хосте (отображенная память),
но в руководстве, похоже, говорится, что это невозможно.
Есть ли какое-то решение для этого

Ответы [ 6 ]

4 голосов
/ 10 ноября 2010

Когда вы выделяете память хоста, вы должны выделить с помощью cudaHostAlloc() и передать флаг cudaHostAllocPortable.Это позволит получить доступ к памяти несколькими контекстами CUDA.

1 голос
/ 10 ноября 2010

Возможно, вы захотите взглянуть на GMAC. Это библиотека, построенная на основе CUDA, которая создает иллюзию совместной памяти. На самом деле он выделяет память по одному и тому же виртуальному адресу на хосте и устройствах с графическим процессором и использует защиту страниц для передачи данных по требованию. Имейте в виду, что это несколько экспериментально, возможно, на стадии бета-тестирования.

http://code.google.com/p/adsm/

1 голос
/ 10 ноября 2010

Решение состоит в том, чтобы вручную управлять этими общими данными.Даже с SLI.

Карты в действительности не имеют общей памяти в режиме SLI - общие данные должны копироваться из одной в другую по шине.

http://forums.nvidia.com/index.php?showtopic=30740

0 голосов
/ 01 декабря 2010

Я специально задал похожий вопрос на форумах NVIDIA о том, как передавать данные между двумя gpus, и получил ответы о том, что если вы хотите использовать два gpus одновременно и передавать данные между ними, у вас должно быть два потока (какРуководство предполагает).В руководстве говорится, что «ресурсы CUDA» не могут быть общими, однако память хоста, из которой они копируются, может быть разделена (используя openmp или mpi).Таким образом, если вы перенесете свою память обратно на хост с каждого устройства, вы можете получить доступ к памяти между устройствами.

Имейте в виду, что это будет очень медленно, так как передача памяти на / с устройств будет очень медленной.

Так что нет, вы не можете получить доступ к памяти gpu1 из gpu2 (даже с sli - на меня кричали, что я вообще не связан с cuda).однако вы можете взять gpu1, записать в область на хосте, а затем взять gpu2 и записать в другой регион, и позволить потокам, управляющим каждым устройством, записать необходимые данные для исправления gpu.

0 голосов
/ 22 ноября 2010

Вы хотите выделить свою закрепленную память как portable , передав cudaHostAllocPortable в cudaHostAlloc(). Вы можете обмениваться данными вне ядра между устройствами из одной и той же закрепленной памяти, как я делал это раньше. Что касается отображенной памяти, я не совсем уверен, но я не понимаю, почему вы не сможете. Попробуйте использовать cudaHostGetDevicePointer(), чтобы получить указатель устройства для текущего устройства (которое вы связали с тем же потоком ЦП.)

Подробнее в разделе 3.2.5.3 Руководства по программированию CUDA (v3.2):

Блок памяти хоста с блокировкой страницы может быть выделен как сопоставленный и переносимый (см. Раздел 3.2.5.1), и в этом случае каждый поток хоста, которому необходимо отобразить блок в свое адресное пространство устройства, должен вызвать cudaHostGetDevicePointer () получить указатель на устройство, так как указатели на устройства, как правило, будут отличаться для разных потоков хоста.

0 голосов
/ 10 ноября 2010

Может, подумаете об использовании чего-то вроде MPI вместе с CUDA?

http://forums.nvidia.com/index.php?showtopic=30741

http://www.ncsa.illinois.edu/UserInfo/Training/Workshops/CUDA/presentations/tutorial-CUDA.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...