Предлагает ли AMD OpenCL что-то похожее на CUDA GPUDirect?
NVIDIA предлагает GPUDirect для уменьшения накладных расходов при передаче памяти. Мне интересно, есть ли подобная концепция для AMD/ATI? В частности:
1) Избегайте ли графические процессоры AMD второй передачи памяти при взаимодействии с сетевыми картами, как описано здесь. В случае потери графики в какой-то момент, вот описание влияния GPUDirect на получение данных из GPU на одной машине для передачи по сетевому интерфейсу: с GPUDirect память GPU переходит в память хоста, а затем прямо в сеть интерфейсная карта Без GPUDirect память GPU отправляется в память хоста в одном адресном пространстве, затем ЦП должен сделать копию, чтобы получить память в адресное пространство памяти другого хоста, затем он может выйти на сетевую карту.
2) Разрешают ли графические процессоры AMD передачу памяти P2P, когда два графических процессора совместно используются на одной шине PCIe, как описано здесь. В случае потери графики в какой-то момент, здесь приведено описание влияния GPUDirect на передачу данных между графическими процессорами на одной и той же шине PCIe: с помощью GPUDirect данные могут перемещаться напрямую между графическими процессорами на одной и той же шине PCIe, не затрагивая память хоста. Без GPUDirect данные всегда должны возвращаться на хост, прежде чем они смогут попасть на другой графический процессор, независимо от того, где находится этот графический процессор.
Редактировать: Кстати, я не совсем уверен, сколько из GPUDirect является программным обеспечением и сколько на самом деле полезно. Я никогда не слышал о том, чтобы программист на GPU использовал это для чего-то реального. Мысли об этом тоже приветствуются.
2 ответа
Я думаю, вы можете искать флаг CL_MEM_ALLOC_HOST_PTR в clCreateBuffer. Хотя в спецификации OpenCL указано, что этот флаг "Этот флаг указывает, что приложение хочет, чтобы реализация OpenCL выделяла память из доступной памяти хоста", неясно, что реализация AMD (или другие реализации) может делать с ней.
Вот информационная ветка по теме http://www.khronos.org/message_boards/viewtopic.php?f=28&t=2440
Надеюсь это поможет.
Редактировать: я знаю, что OpenCL SDK nVidia реализует это как распределение в закрепленной / заблокированной страницы памяти. Я совершенно уверен, что именно это делает AMD OpenCL SDK при работе на GPU.
Хотя этот вопрос довольно старый, я хотел бы добавить свой ответ, так как считаю, что текущая информация здесь неполная.
Как указано в ответе @Ani, вы можете выделить память хоста с помощью CL_MEM_ALLOC_HOST_PTR, и вы, скорее всего, получите закрепленную память хоста, которая позволяет избежать второй копии в зависимости от реализации. Например, в Руководстве по передовой практике NVidia OpenCL говорится:
Приложения OpenCL не имеют прямого контроля над тем, выделяются ли объекты памяти в закрепленной памяти или нет, но они могут создавать объекты с помощью флага CL_MEM_ALLOC_HOST_PTR, и такие объекты, вероятно, будут выделены в закрепленной памяти драйвером для лучшей производительности.
В предыдущих ответах мне не хватало того факта, что AMD предлагает технологию DirectGMA. Эта технология позволяет передавать данные между графическим процессором и любым другим периферийным устройством на шине PCI (включая другие графические процессоры) напрямую, без необходимости проходить через системную память. Он больше похож на RDMA от NVidia (доступен не на всех платформах).
Чтобы использовать эту технологию, вы должны:
имеют совместимый графический процессор AMD (не все из них поддерживают DirectGMA). вы можете использовать расширения OpenCL, DirectX или OpenGL, предоставляемые AMD.
иметь драйвер периферийного устройства (сетевая карта, карта видеозахвата и т. д.), либо предоставить физический адрес, по которому механизм DMA графического процессора может читать / писать из / в. Или иметь возможность запрограммировать периферийный механизм DMA для передачи данных в / из открытой памяти графического процессора.
Я использовал эту технологию для передачи данных непосредственно с устройств видеозахвата в память графического процессора и из памяти графического процессора в проприетарную FPGA. Оба случая были очень эффективными и не требовали дополнительного копирования.
Как отмечают @ananthonline и @harrism, многие функции GPUDirect не имеют прямого эквивалента в OpenCL. Однако, если вы пытаетесь уменьшить накладные расходы на передачу памяти, как упоминалось в первом предложении вашего вопроса, нулевая копия памяти может помочь. Обычно, когда приложение создает буфер на графическом процессоре, его содержимое копируется из памяти процессора в массовую память графического процессора. С нулевой копией памяти нет предварительной копии; вместо этого данные копируются по мере их обращения к ядру графического процессора.
Нулевое копирование не имеет смысла для всех приложений. Вот совет из Руководства по программированию 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