Основная идея может быть примерно такой:
Выполнение 1-й партии вычислений на графическом процессоре
Ввести цикл: {
Копирование результатов из mem устройства в host mem
Выполнение следующей партии вычислений в графическом процессоре (запуск ядра асинхронный и управление немедленно возвращается в CPU)
Обработка результатовпредыдущая итерация на CPU
}
Копировать результаты последней итерации из памяти устройства в хост mem
- Обрабатывать результаты последней итерации
Вы можете получить более точное управление асинхронной работой между процессором и графическим процессором, используя cudaMemcpyAsync, cudaStream и cudaEvent.
Как сказал @harrism, ваше устройство должно поддерживать deviceOverlap для передачи и выполнения памяти, чтобы выполнитьядра одновременно, но даже если у него нет этой опции, вы можете по крайней мере выполнить ядро асинхронно с другими вычислениями на CPU.
edit: deviceOverlap устарелd, следует использовать свойство asyncEngineCount.