2017-02-02 4 views
0

У меня есть часть кода, в которой я использую clCreateBuffer с флагом CL_MEM_ALLOC_HOST_PTR, и я понял, что это выделяет память с устройства. Это правильно, и я пропускаю что-то из стандарта?Почему clCreateBuffer с CL_MEM_ALLOC_HOST_PTR использует дискретную память устройства?

CL_MEM_ALLOC_HOST_PTR: Этот флаг указывает, что приложение хочет, чтобы реализация OpenCL выделяла память из доступной для хоста памяти.

Лично я понял, что этот буфер должен быть буфером на стороне хозяина, который позже может быть отображен с использованием clEnqueueMapBuffer.

Следит некоторую информацию об устройстве, которое я использую:

Device: Tesla K40c 
Hardware version: OpenCL 1.2 CUDA 
Software version: 352.63 
OpenCL C version: OpenCL C 1.2 
+1

Это должен быть намек, а не запрос. Ваше устройство выбирает наилучший способ использования памяти. –

+0

Таким образом, «выделение памяти из доступной памяти хоста» означает: «выделяет буфер в области памяти (на хосте или на стороне устройства), которая может быть доступна - например, с помощью clEnqueueMapBuffer - с хоста»? – Nicola

+0

Было еще одно обсуждение: http://stackoverflow.com/questions/25496656/cl-mem-use-host-ptr-vs-cl-mem-copy-host-ptr-vs-cl-mem-alloc-host- ptr –

ответ

0

Он описывается как

реализации OpenCL разрешено кэш содержимое буфера , на который указывает host_ptr в устройстве Память. Эта кешированная копия может использоваться , когда ядра выполняются на устройстве.

в

https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/clCreateBuffer.html

Описание для CL_MEM_USE_HOST_PTR но он отличается только его распределителем из CL_MEM_ALLOC_HOST_PTR. USE использует указатель, заданный хозяином, ALLOC использует значение собственных распределителей функции opencl.

Кэширование не применимо для некоторых интегрированных типов gpu, поэтому оно не всегда верно.

+0

Но, как вы сказали, описывается только 'CL_MEM_USE_HOST_PTR'. Если это также верно для флага 'CL_MEM_ALLOC_HOST_PTR', разве это не должно быть где-то написано? (Я просто стараюсь быть точным, чтобы не понимать неправильно) – Nicola

+0

Выделен на хосте opencl или используется то, что было выделено на хосте пользователем. Выделяет на хосте. Память устройств предназначена для сопоставления + кеширования, но чистое сопоставление должно быть возможно только с помощью аппаратного кеша (L1, L2). Поэтому он не всегда используется. Хост-память предназначена только для тени памяти устройства, так что хост взаимодействует с устройством. Невозможно выделить память устройства из-за преимуществ сопоставления или объединения –

+0

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

0

Ключевая фраза из спецификации является HOST доступны:

Этот флаг указывает, что приложение хочет реализация OpenCL для выделения памяти из хоста доступны памяти.

Он не говорит, что он будет выделен в памяти хоста: он говорит, что он будет доступен хосту.

Сюда относится любая память, которая может быть отображена на адреса памяти, видимые на процессоре. Обычно некоторые, если не все VRAM в дискретном графическом устройстве, будут доступны через PCI memory range, выставленные в одном из BARs, - они попадают в адресное пространство физической памяти процессора через прошивку или ОС. Они могут использоваться аналогично системной памяти в таблицах страниц и, таким образом, доступны для пользовательских процессов, сопоставляя их с адресами виртуальной памяти.

В спецификации даже идет упоминать эту возможность, по крайней мере, в сочетании с другим флагом:

CL_MEM_COPY_HOST_PTR может быть использован с CL_MEM_ALLOC_HOST_PTR, чтобы инициализировать содержимое cl_mem объекта выделена с помощью хост-доступной (например,PCIe).

Если вы определенно хотите использовать системную память для буфера (может быть хорошим выбором, если доступ GPU к нему редок или реже, чем ЦП Гости могут воспользоваться), выделить его самостоятельно и завернуть его в буфере с CL_MEM_USE_HOST_PTR. (Которые все еще могут быть кэшированы в VRAM, в зависимости от реализации.)

Смежные вопросы