Как выделить одну половину буфера OpenCL в памяти хоста, а другую - в памяти устройства?

0

Если я правильно ее понимаю, я могу использовать CL_MEM_USE_HOST_PTR при распределении CL-буфера для доступа к памяти хоста от выполнения ядра устройства. Я могу использовать CL_MEM_COPY_HOST_PTR для копирования данных в память устройства. Мой вопрос: могу ли я как-то выделить массив A с половиной его выделенной в памяти хоста, а другую половину, выделенную в памяти устройства. Скажем, первая половина выделена в памяти хоста. A [0 ~ (N/2-1)] обращается к памяти хоста, а A [N/2 ~ (N-1)] обращается к памяти устройства.

Теги:
memory
opencl

1 ответ

0
Лучший ответ

Реальная правда заключается в том, что вы не можете знать, где находится память.

Выделенная память объекта находится внутри контекста OpenCL, который является чисто виртуальным и может быть где угодно (устройства или хост). Вы можете указывать только OpenCL, если вы хотите, чтобы память была взята из указателя или скопирована из указателя или выделена копия на хосте. Однако ни одна из этих гарантий не гарантирует согласованность памяти на стороне хоста. То есть, память, которая у вас есть на хосте, может быть не последней версией этого объекта памяти. Поскольку OpenCL позволяет кэшировать память в устройстве (-ах).

Некоторые поставщики указывают, что в своих реализациях и SDK используются некоторые флаги для выбора между различными типами памяти (то есть: закреплены). Но это зависит от реализации и не изменяет того факта, что вам все еще нужно использовать clReadBuffer() или clMapBuffer(), чтобы гарантировать, что значение на стороне хоста является реальным выходом вашего ядра.

Из моего личного опыта, если вы не используете тяжелый ввод-вывод. Вы можете просто пойти с флагом CL_MEM_READ_WRITE.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню