Где расположен буфер в 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. Пользователь может захотеть иметь более явный контроль над расположением своих объектов памяти при создании. Это может быть использовано для:
- Убедитесь, что объект размещен на определенном устройстве до использования.
- Упреждающая миграция объекта с одного устройства на другое.
Как правило, объекты памяти неявно переносятся на устройство, для которого предназначены команды в очереди, использующие объект памяти.