Я использовал cl_mem в некотором своем шаблонном коде OpenCL, но я использовал его через контекст, а не четкое понимание того, что именно это такое. Я использовал его в качестве типа памяти, которую я вставляю и вынимаю из платы, которая до сих пор была плавающей. Я попытался просмотреть документы OpenCL, но cl_mem не отображается (не так ли?). Есть ли документация по нему, или это просто и может кто-нибудь объяснить.
Вопрос про cl_mem в OpenCL
Ответы (2)
Для компьютера cl_mem — это число (например, обработчик файлов для Linux), зарезервированное для использования в качестве «идентификатора памяти» (API/драйвер, который хранит информацию о вашей памяти под этим номером, знает, что он хранит/как он большой и все такое)
Тип cl_mem является дескриптором «объекта памяти» (как описано в разделе 3.5 документа Спецификация OpenCL 1.1). По сути, это входные и выходные данные для ядер OpenCL, которые возвращаются из вызовов OpenCL API в основном коде, таком как clCreateBuffer.
cl_mem clCreateBuffer (cl_context context, cl_mem_flags flags,
size_t size, void *host_ptr, cl_int *errcode_ret)
Представленным областям памяти могут быть разрешены различные шаблоны доступа, например. Только для чтения или размещаться в разных областях памяти, в зависимости от флагов, установленных в вызовах создания буфера.
Дескриптор обычно сохраняется, чтобы позволить более позднему вызову освободить память, например:
cl_int clReleaseMemObject (cl_mem memobj)
Короче говоря, он обеспечивает абстракцию того, где на самом деле находится память: вы можете копировать данные в связанную память или обратно через API-интерфейсы OpenCL clEnqueueWriteBuffer и clEnqueueReadBuffer, но реализация OpenCL может выделять пространство там, где она хочет.