То, что вы пытаетесь сделать, так не возможно со стороны устройства, если оно не поддерживает вычислительную способность 3.5. Если у вас есть такая карта, см. Редактирование.
Да, вы можете получить доступ к ОЗУ GPU с другого устройства, передав указатель устройства, выделенный на другое устройство, в ваше ядро. Затем исполняемая среда выполнения предоставит запрашиваемые данные на правый графический процессор. Однако это не очень эффективно, потому что каждый доступ к другой памяти устройств приводит к операции memcopy как однорангового, так и устройства-хост-устройства.
Что вы можете сделать, это выполнить данные предварительной выборки из вашего хост-кода и использовать разные потоки для ваших операций memcopy (cudaMemcpy_async
) и выполнения ядра. Однако это работает только в том случае, если у вас есть приличная карта с одним разделенным копирующим устройством, и вам нужно сделать явную блокировку, потому что нет структур в структурах, которые будут держать ваше ядро до завершения передачи данных.
EDIT:
Если у вас есть вычислить capbility 3.5 устройства вы можете использовать среду исполнения устройства Cuda для memcopy от устройства к устройству в пределах вашего кода устройства. См. Документацию по динамическому параллелизму здесь: http://docs.nvidia.com/cuda/pdf/cuda_dynamic_parallelism_programming_guide.pdf Обратите внимание, что все операции memcopy на устройстве также асинхронны. И вы вернетесь, чтобы сохранить согласованность данных снова самостоятельно.
В чем проблема? Доступ к памяти одного графического процессора с другого графического процессора? В этом случае вы можете использовать Peer-to-Peer (P2P) GPU \t копии памяти, посмотрите пример SimpleP2P SDK CUDA. – JackOLantern
Если ваша система поддерживает UVA, вы можете адресовать одно пространство памяти GPU с другого графического процессора внутри функции ядра, например 'dst [i] = src [i];'. – JackOLantern