cl_context уже привязан к конкретной видеокарте. Если это метаустройство, которое под собой несколько карт держит - оно само разберется что где выделять.
Что-то я не могу понять как там обмен идёт. Для того чтобы забрать данные в память процессора я должен выделять для него выделять clSVMAlloc или malloc?
Что-то я не могу понять как там обмен идёт. Для того чтобы забрать данные в память процессора я должен выделять для него выделять clSVMAlloc или malloc?
Читал главу 3.3.3 Memory Model: Shared Virtual Memory спецификации OpenCL 2.0 (с архиважной табличкой в конце) и главу 6.2 Shared Virtual Memory (SVM) в AMD OpenCL User Guide?
Зависит от устройства. Если нет поддержки Fine-Grained system SVM, т.е. в CL_DEVICE_SVM_CAPABILITIES не стоит бит CL_DEVICE_SVM_FINE_GRAIN_SYSTEM то работать так называемые «системные» указатели от malloc'а не будут.
По стандарту в clSetKernelArgSVMPointer() можно передать только
The SVM pointer value specified as the argument value can be the pointer returned by clSVMAlloc or can be a pointer + offset into the SVM region.
Т.е. похоже что системные указатели предполагается что передают через обычный clSetKernelArg - к сожалению, не было устройств с такими возможностями потыкать-проверить.
SVM - это, как следует из названия, общая виртуальная память. Когда на хосте страница виртуальной памяти свопится на диск, а когда нет - решает операционная система. Когда она одна на несколько процессов - решает тоже ОС. Тут принцип тот же - ты выделяешь виртуальную память, а дальше реализация OpenCL 2.0+ разберётся, где эта память будет физически лежать и как её обновлять, дублировать, синхронизировать. Раньше надо было самому туда-сюда буферы гонять или мапить, сейчас может быть у устройств физически общая память - можно устроить им специальную общую виртуальную память с валидными и на хосте, и на устройствах одинаковыми указателями - прогресс. А можно вообще с устройства использовать виртуальные указатели хоста, если устройство так умеет - вообще будущее сегодня. Но так как стандарт один, а устройств много - надо отталкиваться от своей платформы. «Грубые» SVM указатели для всех OpenCL 2.0+ устройств, «точные» указатели SVM aka системные указатели от malloc - для некоторых.
Зависит от устройства. Если нет поддержки Fine-Grained system SVM, т.е. в CL_DEVICE_SVM_CAPABILITIES не стоит бит CL_DEVICE_SVM_FINE_GRAIN_SYSTEM то работать так называемые «системные» указатели от malloc'а не будут. По стандарту в clSetKernelArgSVMPointer() можно передать только
У меня система полностью соответствует требованиям OpenCL 2.0: IOMMUv2, PCIev3, PCIe Atomics, CRAT table support, ну и дрова конечно.
Совершенно случайно наткнулся на функцию clEnqueSVMMigrateMem, которая как раз даёт контроль над тем, куда деть SVM. На какое-то устройство либо на хост. Так что ответ будет - можно, но только начиная с OpenCL 2.1. Про работающие реализации 2.1 пока что не слышно.
I know, what you feel bro...
У меня работал OpenCL 2.0 (R9 380) на fglrx блобе, а потом бац - и в amdgpu-pro и меня уже только OpenCL 1.2, а ROCm не поддерживает мою карту потому что, видите ли, там в карточном биосе чего-то не хватает для OpenL 2.0 (Но раньше он же работал! И в оффтопике работает!).
По поводу данного случая - то что что работают Coarse+Fine grain buffer - это отлично, можно использовать SVM. Как пишут в АМД-шных доках,
Fine-grained buffer memory has the same virtual address for all devices it is allocated on. In the AMD implementation, the physical memory is allocated on the Device-Visible Host Memory.
Системные указатели есть, видимо, только в APU. Может быть Intel уже запилил у себя поддержку - у них OpenCL пилится и развивается семимильными шагами, в отличие от остальных двух вендоров.
Так что с SVM для меня сюрпризов не было.
А вот что меня поначалу сильно удивило - это CL_DEVICE_VERSION 1.2 при CL_DEVICE_OPENCL_C_VERSION 2.0, это нарушает стандарты как OpenCL 1.2, так и OpenCL 2.0. Но потом я вспомнил, что они упоротые и это, видимо, тот самый
OpenCL 2.0 compatible kernel language support with OpenCL 1.2 compatible runtime
из release notes ROCm 1.7.
В общем хоть какой-то SVM есть - уже можно жить. Но такого что «ух ты, я вчера узнал про какой-то новый API к крутой апаратной фиче а сегодня выяснилось что в OpenCL стэке он уже везде поддержан» с AMD давно не было.
Когда рынку нужны были встраиваемые решения и ноутбуки - AMD вкладывалось в десктопные процессоры. Когда рынку нужна была высокая скорость fp16 для нейросетей AMD вкладывалось в производительную графику для приставок. Когда рынку нужно майнить эфир AMD вкладывается в перенос программ с CUDA на HIP.
Умудрились настолько забить при этом на OpenCL, что рабочую реализацию OpenCL 2.1 первой выкатила Intel.
Так как у меня ROCm даже согласно их документации не должен был завестись, я его предметно не тыкал и не знаю. Судя по их гитхабу - запустить пример с вектором это рекомендуемый и пока единственный способ понять, завелось или нет. Создай им issue - хочу тулзу как clinfo и чтобы было сразу понятно, почему не работает (процессор не тот, GPU не тот, биос не тот?). В крайнем случае тыкнут в готовую тулзу, если она есть.
Но учитывая фантастически низкий процент систем, на которых HSA работает подумай ещё раз, стоит ли с ним связываться =) Для меня фантазии использовать его (через HIP) в продакшене закончились в тот момент, когда выяснилось что поддержки оффтопика вообще нет.