2013-10-08 2 views
2

С CUDA SDK 5.5 можно использовать для копирования данных:Как использовать GPU-DMA из кода GPU-CUDA для копирования данных?

  • от хоста: cudaMemcpy(); использовать GPU-DMA, если память возлагали
  • от хозяина: memcpy(); или cudaMemcpy(); использовать CPU Cores, если память не возлагали
  • от ГПУ: for() { dst[i] = src[i]; } или memcpy(); использовать GPU сердечники
  • от GPU: использовать GPU-DMA ???

Как я могу использовать GPU-DMA в ядра-функции из GPU-CUDA кода для копирования данных?

+0

В чем проблема? Доступ к памяти одного графического процессора с другого графического процессора? В этом случае вы можете использовать Peer-to-Peer (P2P) GPU \t копии памяти, посмотрите пример SimpleP2P SDK CUDA. – JackOLantern

+0

Если ваша система поддерживает UVA, вы можете адресовать одно пространство памяти GPU с другого графического процессора внутри функции ядра, например 'dst [i] = src [i];'. – JackOLantern

ответ

3

То, что вы пытаетесь сделать, так не возможно со стороны устройства, если оно не поддерживает вычислительную способность 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 на устройстве также асинхронны. И вы вернетесь, чтобы сохранить согласованность данных снова самостоятельно.

+0

Спасибо! Использует ли GPU функцию 'memcpy()' использует DMA или просто создает отдельный STREAM, в котором он асинхронно копирует: 'for() dst [i] = src [i];'? – Alex

+1

Документация не совсем понятна. Я думаю, вам нужно сделать некоторые профилирования и посмотреть, вызывается ли одноранговая memcopies, когда вы вызываете cudaMemcpyAsync в свой код ядра. Скорее всего, одноранговый доступ должен быть включен сначала с помощью кода хоста. –