Где расположен буфер в opencl?

Я пытался создать буфер памяти в OpenCL с привязкой C++. Предложение выглядит так

cl::Buffer buffer(context,CL_MEM_READ_ONLY,sizeof(float)*(100));

Это предложение смущает меня, потому что оно не определяет, на каком устройстве выделяется память. В принципе context содержит все устройства, включая cpu и gpu, на выбранной платформе. Правда ли, что буфер помещен в общую область, общую для всех устройств?

1 ответ

Решение

Спецификация не определяет, где находится память. Для пользователя API это "в контексте".

Если у вас есть только одно устройство, вероятно (99,99%) будет в устройстве. (В редких случаях это может быть на хосте, если устройству пока не хватает памяти)

В случае множества разных устройств, оно будет в одном из них при создании. Но он может прозрачно перейти на другое устройство в зависимости от запуска ядра.

Это причина, почему существует вызов clEnqueueMIgrateMemObjects (только для OpenCL 1.2). Это позволяет пользователю рассказать API-интерфейсу о том, где потребуется память, и заранее подготовить копию.

Вот определение того, что он делает:

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

  • Убедитесь, что объект размещен на определенном устройстве до использования.
  • Упреждающая миграция объекта с одного устройства на другое.

Как правило, объекты памяти неявно переносятся на устройство, для которого предназначены команды в очереди, использующие объект памяти.

Другие вопросы по тегам