Есть несколько вещей, которые вы можете попробовать устранить узкое место PCIe:
- Асинхронные передачи - разрешает наложение вычислений и массовую передачу
- Отображенная память - позволяет ядру передавать данные в / из графического процессора во время выполнения
Обратите внимание, что ни один из этих методов не ускоряет передачу, а лишь сокращает время, в течение которого графический процессор ожидает получения данных.
С помощью функции cudaMemcpyAsync
API вы можете инициировать передачу, запустить одно или несколько ядер, которые не зависят от результата передачи, синхронизировать хост и устройство, а затем запустить ядра, которые были ожидание передачи завершено. Если вы можете структурировать свой алгоритм так, чтобы вы выполняли продуктивную работу во время передачи, то асинхронные копии - хорошее решение.
С помощью функции cudaHostAlloc
API вы можете выделить память хоста, которая может читать и записывать данные непосредственно из графического процессора. Причина, по которой это происходит быстрее, заключается в том, что блоку, которому требуются данные хоста, нужно только дождаться передачи небольшой части данных. Напротив, обычный подход заставляет все блоки ждать, пока завершится передача whole . Отображенная память по существу разбивает большую монолитную передачу на связку или меньшие операции копирования, поэтому задержка уменьшается.
Подробнее об этих темах можно прочитать в Разделе 3.2.6-3.2.7 Руководства по программированию CUDA и Разделе 3.1 Руководства по наилучшим практикам CUDA . Глава 3 Руководства по рекомендациям OpenCL объясняет, как использовать эти функции в OpenCL.