Предлагает ли AMD OpenCL что-то похожее на CUDA GPUDirect? - PullRequest
10 голосов
/ 15 февраля 2012

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 25 февраля 2012

Как отмечают @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

2 голосов
/ 22 июня 2019

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

Как указано в ответе @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 GPUможно читать / писать из / в.Или можно запрограммировать периферийное ядро ​​DMA для передачи данных в / из открытой памяти графического процессора.

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

Взаимодействие OpenCL с устройствами PCIe

2 голосов
/ 16 февраля 2012

Я думаю, вы, возможно, ищете флаг 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.

...