CUDA: код процессора параллельно к коду GPU - PullRequest
3 голосов
/ 22 июня 2011

У меня есть программа, в которой я делаю кучу вычислений на GPU, затем я выполняю операции с памятью с этими результатами на CPU, затем я беру следующий пакет, если данные, и делаю то же самое все время. Теперь было бы намного быстрее, если бы я мог выполнить первый набор вычислений, а затем начать со второго пакета, пока мой процессор занимался операциями с памятью. Как бы я это сделал?

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Все вызовы ядра CUDA (например, function<<<blocks, threads>>>()) являются асинхронными - они немедленно возвращают управление вызывающему потоку хоста.Поэтому вы всегда можете выполнять работу с процессором параллельно с работой с графическим процессором, просто помещая работу процессора после вызова ядра.

Если вам также необходимо одновременно передавать данные с графического процессора на процессор, вам потребуется графический процессордля поля deviceOverlap установлено значение true (проверьте с помощью cudaGetDeviceProperties()), и вам необходимо использовать cudaMemcpyAsync() из отдельного потока CUDA.

Существуют примеры, демонстрирующие эту функцию в NVIDIA CUDA SDK- Например, примеры "simpleStreams" и "asyncAPI".

2 голосов
/ 22 июня 2011

Основная идея может быть примерно такой:

  • Выполнение 1-й партии вычислений на графическом процессоре

  • Ввести цикл: {

    Копирование результатов из mem устройства в host mem

    Выполнение следующей партии вычислений в графическом процессоре (запуск ядра асинхронный и управление немедленно возвращается в CPU)

    Обработка результатовпредыдущая итерация на CPU

    }

  • Копировать результаты последней итерации из памяти устройства в хост mem

  • Обрабатывать результаты последней итерации

Вы можете получить более точное управление асинхронной работой между процессором и графическим процессором, используя cudaMemcpyAsync, cudaStream и cudaEvent.

Как сказал @harrism, ваше устройство должно поддерживать deviceOverlap для передачи и выполнения памяти, чтобы выполнитьядра одновременно, но даже если у него нет этой опции, вы можете по крайней мере выполнить ядро ​​асинхронно с другими вычислениями на CPU.

edit: deviceOverlap устарелd, следует использовать свойство asyncEngineCount.

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