Предлагает ли AMD OpenCL нечто подобное CUDA GPUDirect?

NVIDIA предлагает GPUDirect, чтобы уменьшить накладные расходы на передачу данных. Мне интересно, есть ли аналогичная концепция для AMD/ATI? В частности:

1) Графические процессоры AMD избегают второй передачи памяти при взаимодействии с сетевыми картами, как описано здесь. В случае потери графика в какой-то момент здесь приводится описание воздействия GPUDirect на получение данных с GPU на одной машине, которая будет передаваться по сетевому интерфейсу: с GPUDirect память GPU переходит в память хоста, а затем прямо в сеть интерфейсная карта. Без GPUDirect память GPU переходит в память хоста в одном адресном пространстве, тогда CPU должен сделать копию, чтобы получить память в другое адресное пространство адресной памяти хоста, а затем она может выйти на сетевую карту.

2) Графические процессоры AMD позволяют передавать P2P-память, когда два GPU совместно используются на одной шине PCIe, как описано здесь. В случае потери графика в какой-то момент здесь описывается влияние GPUDirect на передачу данных между графическими процессорами на одной и той же шине PCIe: с помощью GPUDirect данные могут перемещаться напрямую между графическими процессорами на одной шине PCIe, не касаясь памяти хоста. Без GPUDirect данные всегда должны возвращаться к хосту, прежде чем он сможет перейти на другой графический процессор, независимо от того, где находится этот графический процессор.

Edit: BTW, я не совсем уверен, сколько GPUDirect - это утилита для паролей, и насколько это действительно полезно. Я никогда не слышал о том, как программист GPU использует его для чего-то реального. Мысли об этом тоже приветствуются.

Ответ 1

Я думаю, вы можете искать флаг CL_MEM_ALLOC_HOST_PTR в clCreateBuffer. Хотя в спецификации OpenCL указано, что этот флаг "Этот флаг указывает, что приложение хочет, чтобы реализация OpenCL выделяла память из доступной памяти хоста", неизвестно, что может сделать с ней реализация AMD (или другие реализации).

Здесь информативный поток по теме http://www.khronos.org/message_boards/viewtopic.php?f=28&t=2440

Надеюсь, что это поможет.

Изменить: я знаю, что nVidia OpenCL SDK реализует это как выделение в фиксированной/заблокированной записями памяти. Я вполне уверен, что это то, что делает SDK OpenCL SD при работе на графическом процессоре.

Ответ 2

Как указано в @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

Ответ 3

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

Как указано в ответе @Ani, вы можете выделить память хоста, используя CL_MEM_ALLOC_HOST_PTR, и вы, скорее всего, получите закрепленную память хоста, которая избегает второй копии в зависимости от реализации. Например, Руководство по передовой практике NVidia OpenCL гласит:

Приложения OpenCL не имеют прямого контроля над тем, выделяются ли объекты памяти в закрепленной памяти или нет, но они могут создавать объекты с использованием флага CL_MEM_ALLOC_HOST_PTR, и такие объекты, вероятно, будут размещаться драйвером в закрепленной памяти для лучшей производительности.

В предыдущих ответах мне не хватает того, что AMD предлагает технологию DirectGMA. Эта технология позволяет передавать данные между графическим процессором и любым другим периферийным устройством на шине PCI (включая другие графические процессоры) напрямую, без необходимости проходить через системную память. Это больше похоже на NVidia RDMA (доступно не на всех платформах).

Чтобы использовать эту технологию, вы должны:

  • иметь совместимый графический процессор AMD (не все из них поддерживают DirectGMA). Вы можете использовать расширения OpenCL, DirectX или OpenGL, предоставляемые AMD.

  • пусть периферийный драйвер (сетевая карта, плата видеозахвата и т.д.) либо предоставит физический адрес, по которому ядро графического процессора DMA может выполнять чтение/запись из/в. Или иметь возможность запрограммировать механизм периферийного DMA для передачи данных в/из открытой памяти графического процессора.

Я использовал эту технологию для передачи данных непосредственно с устройств видеозахвата в память графического процессора и из памяти графического процессора в проприетарную ПЛИС. Оба случая были очень эффективными и не требовали дополнительного копирования.

Интерфейс OpenCL с устройствами PCIe