Как устранить узкие места передачи памяти хоста + устройства в OpenCL / CUDA - PullRequest
3 голосов
/ 20 октября 2010

Если мой алгоритм является узким местом передачи данных между хостами и устройствами между хостами, является ли единственным решением другой или пересмотренный алгоритм?

Ответы [ 2 ]

5 голосов
/ 20 октября 2010

Есть несколько вещей, которые вы можете попробовать устранить узкое место PCIe:

  • Асинхронные передачи - разрешает наложение вычислений и массовую передачу
  • Отображенная память - позволяет ядру передавать данные в / из графического процессора во время выполнения

Обратите внимание, что ни один из этих методов не ускоряет передачу, а лишь сокращает время, в течение которого графический процессор ожидает получения данных.

С помощью функции cudaMemcpyAsync API вы можете инициировать передачу, запустить одно или несколько ядер, которые не зависят от результата передачи, синхронизировать хост и устройство, а затем запустить ядра, которые были ожидание передачи завершено. Если вы можете структурировать свой алгоритм так, чтобы вы выполняли продуктивную работу во время передачи, то асинхронные копии - хорошее решение.

С помощью функции cudaHostAlloc API вы можете выделить память хоста, которая может читать и записывать данные непосредственно из графического процессора. Причина, по которой это происходит быстрее, заключается в том, что блоку, которому требуются данные хоста, нужно только дождаться передачи небольшой части данных. Напротив, обычный подход заставляет все блоки ждать, пока завершится передача whole . Отображенная память по существу разбивает большую монолитную передачу на связку или меньшие операции копирования, поэтому задержка уменьшается.

Подробнее об этих темах можно прочитать в Разделе 3.2.6-3.2.7 Руководства по программированию CUDA и Разделе 3.1 Руководства по наилучшим практикам CUDA . Глава 3 Руководства по рекомендациям OpenCL объясняет, как использовать эти функции в OpenCL.

3 голосов
/ 20 октября 2010

Вам действительно нужно сделать математику, чтобы быть уверенным, что вы собираетесь делать достаточно обработки на GPU, чтобы сделать целесообразной передачу данных между хостом и GPU. В идеале вы делаете это на этапе проектирования, прежде чем приступать к кодированию, поскольку это может нарушить условия сделки.

...