Потоки CUDA позволяют выполнять передачу PCI Express одновременно с обработкой ядра. В соответствии с Законом Амдала потоки CUDA получат выгоду только от рабочих нагрузок, которые выполняют одинаковые объемы передачи данных и обработки ядра. Чтобы определить, принесет ли ваша рабочая нагрузка пользу, профилируйте или добавьте некоторый временной код в ваше приложение, чтобы увидеть теоретический максимальный выигрыш в производительности.
Обратите внимание, что для повышения производительности потоков CUDA вам необходимо "программно-конвейерно" загружать, запускать и выгружать ядро. Сделайте это:
foreach stream {
cudaMemcpyAsync( device[stream], host[stream], ... stream );
}
foreach stream {
LaunchKernel<<<...stream>>>( ... );
// you can launch multiple kernels in stream, if desired.
}
foreach stream {
cudaMemcpyAsync( host[stream], device[stream], ... stream );
}
не это:
foreach stream {
cudaMemcpyAsync( device[stream], host[stream], ... stream );
LaunchKernel<<<...stream>>>( ... );
cudaMemcpyAsync( host[stream], device[stream], ... stream );
}