С CUDA SDK 5.5 я могу использовать для копирования данных:
cudaMemcpy();
использовать GPU-DMA, если память закрепленаmemcpy();
или же cudaMemcpy();
использовать процессорные ядра, если память не закрепленаfor() { dst[i] = src[i]; }
или же memcpy();
использовать ядра GPUКак я могу использовать GPU-DMA в ядро-функция кода GPU-CUDA для копирования данных?
То, что вы пытаетесь сделать, невозможно со стороны устройства, если оно не поддерживает вычислительные возможности 3.5. Если у вас есть такая карта, см. Редактирование.
Да, вы можете получить доступ к ОЗУ GPU с другого устройства, передав указателю устройства, назначенному на другом устройстве, ваше ядро. Затем среда выполнения выдаст запрошенные данные на нужный графический процессор. Однако это не очень эффективно, потому что каждый доступ к памяти других устройств приводит к операции memcopy либо одноранговой связи, либо устройства хост-устройство.
Что вы можете сделать, это выполнить предварительную выборку данных из вашего хост-кода и использовать различные потоки для ваших операций memcopy (cudaMemcpy_async
) и ваши ядра выполнения. Однако это работает только в том случае, если у вас есть приличная карта с одним отделенным копирующим модулем, и вам нужно сделать явную блокировку, потому что нет встроенных структур, которые будут удерживать ваше ядро до завершения передачи данных.
РЕДАКТИРОВАТЬ:
Если у вас есть устройство с поддержкой вычислений 3.5, вы можете использовать среду выполнения cuda для memcopy с устройства на устройство в коде вашего устройства. Смотрите документацию по динамическому параллелизму здесь: http://docs.nvidia.com/cuda/pdf/cuda_dynamic_parallelism_programming_guide.pdf Обратите внимание, что все операции memcopy на устройстве также являются асинхронными. И вам придется снова самостоятельно сохранять согласованность данных.
Других решений пока нет …