NVIDIA предлагает GPUDirect для снижения накладных расходов на передачу данных. Мне интересно, есть ли аналогичная концепция для AMD / ATI? В частности:
1) Могут ли GPU AMD избежать второй передачи памяти при взаимодействии с сетевыми картами, как описано здесь . В случае потери графика в какой-то момент здесь приводится описание воздействия GPUDirect на получение данных с GPU на одной машине, которая будет передаваться по сетевому интерфейсу: с GPUDirect память GPU переходит в память хоста, а затем прямо в сеть интерфейсная карта. Без GPUDirect память GPU переходит в память хоста в одном адресном пространстве, тогда CPU должен сделать копию, чтобы получить память в другое адресное пространство адресной памяти хоста, а затем она может выйти на сетевую карту.
2) Графические процессоры AMD позволяют передавать P2P-память, когда два GPU совместно используются на одной шине PCIe, как описано здесь . В случае потери графика в какой-то момент здесь описывается влияние GPUDirect на передачу данных между графическими процессорами на одной и той же шине PCIe: с помощью GPUDirect данные могут перемещаться напрямую между графическими процессорами на одной шине PCIe, не касаясь памяти хоста. Без GPUDirect данные всегда должны возвращаться к хосту, прежде чем он сможет перейти на другой графический процессор, независимо от того, где находится этот графический процессор.
Edit: BTW, я не совсем уверен, сколько GPUDirect – это утилита, и насколько это действительно полезно. Я никогда не слышал о том, как программист GPU использует его для чего-то реального. Мысли об этом тоже приветствуются.
Я думаю, вы можете искать флаг CL_MEM_ALLOC_HOST_PTR в clCreateBuffer. Хотя в спецификации OpenCL указано, что этот флаг «Этот флаг указывает, что приложение хочет, чтобы реализация OpenCL выделяла память из доступной памяти хоста», неизвестно, что может сделать с ней реализация AMD (или другие реализации).
Вот информативный поток по теме http://www.khronos.org/message_boards/viewtopic.php?f=28&t=2440
Надеюсь это поможет.
Редактирование: я знаю, что OpenCL SDK от nVidia реализует это как выделение в фиксированной / заблокированной записями памяти. Я совершенно уверен, что это то, что делает OpenCL SDK от AMD при работе на графическом процессоре.
Как указано в @ananthonline и @harrism, многие функции GPUDirect не имеют прямого эквивалента в OpenCL. Однако, если вы пытаетесь уменьшить накладные расходы на передачу данных, как упоминалось в первом предложении вашего вопроса, может помочь копирование с нулевой копией. Обычно, когда приложение создает буфер на графическом процессоре, содержимое буфера копируется из памяти CPU в память GPU в массовом порядке. С нулевой копией памяти нет предварительной копии; вместо этого данные копируются, поскольку к нему обращается ядро GPU.
Нулевая копия не имеет смысла для всех приложений. Вот советы Руководства по программированию AMD APP OpenCL о том, когда его использовать:
Объекты резидентной памяти с нулевой копией могут повысить производительность, если доступ к памяти хоста осуществляется устройством разреженным образом или когда общий буфер памяти хоста распределяется между несколькими устройствами, а копии слишком дороги. При выборе этого стоимость перевода должна быть больше, чем дополнительная стоимость медленного доступа.
Таблица 4.3 Руководства по программированию описывает, какие флаги передаются clCreateBuffer, чтобы использовать нулевую копию (CL_MEM_ALLOC_HOST_PTR или CL_MEM_USE_PERSISTENT_MEM_AMD, в зависимости от того, хотите ли вы иметь доступную для устройства память хоста или память устройства, доступную для хоста). Обратите внимание, что поддержка нулевой копии зависит как от ОС, так и от аппаратного обеспечения; он, похоже, не поддерживается в Linux или более старых версиях Windows.
Руководство по программированию на базе AMD APP OpenCL: http://developer.amd.com/sdks/AMDAPPSDK/assets/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf