Техническое примечание TN2335

Выбор GPU для OpenCL на Mac Pro (в конце 2013)

Mac Pro (В конце 2013) включает двойной класс рабочей станции AMD FirePro GPUs, которые идеальны для, вычисляют интенсивные задачи. Этот документ описывает, как запросить GPUs и выбрать один или оба для использования OpenCL.

Что необходимо знать при использовании OpenCL
Выбор GPU если не с помощью OpenGL
Выбор GPU when using CL/GL Sharing
История версии документа

Что необходимо знать при использовании OpenCL

OS X имеет долгосрочную поддержку многократного GPUs, и следующие ссылки имеют полезную справочную информацию для установки Вашего приложения для многократного GPUs.

Техническое примечание TN2229: Поддержка Многократного GPUs на OS X описывает использование многократного GPUs на платформе Mac.

Введение в Руководство по программированию OpenGL для OS X описывает много ключевых понятий, связанных с графической системой и системой отображения.

Сеанс WWDC 2013 года 508: Работа с OpenCL описывает, как переключить между двумя GPUs в Mac переносимые соображения питания использования.

Mac Pro (В конце 2013) отличается от другого Macs как, только основной GPU обеспечивает вывод для дисплея. Вторичный GPU обеспечивает дополнительную возможность обработки и может выполнить OpenCL и внеэкранные задачи OpenGL, не влияя на скорость отклика пользовательского интерфейса.Примечание: Может быть дополнительная задержка при совместном использовании данных между основным и вторичным GPU. Сеанс WWDC 2013 года 508, упомянутый выше, также покрытия подробных сведений совместного использования данных с OpenCL.

Выбор GPU если не с помощью OpenGL

Следующий код показывает, как искать массив, содержащий cl_device_ids для всех доступных GPUs в машине. Этот массив будет содержать два устройства на Mac Pro (В конце 2013). Оба устройства будут иметь то же имя, и их запросы clGetDeviceInfo возвратят те же значения. Приложение, не использующее совместное использование CL/GL для передачи объектов между OpenCL и OpenGL, может создать cl_context из этого устройства, выстраивают и затем выполняют, вычисляют задачи на любом устройстве.

Перечисление 1  , Ищущее доступный GPUs

cl_uint num = 0;
clGetDeviceIDs(NULL,CL_DEVICE_TYPE_GPU,0,NULL,&num);
 
cl_device_id devices[num];
clGetDeviceIDs(NULL,CL_DEVICE_TYPE_GPU,num,devices,NULL);
 
cl_context ctx = clCreateContext(NULL,num,devices,NULL,NULL,NULL);

Программы, не совместно использующие ресурсы между OpenCL и OpenGL, могут использовать API CGL для различения GPUs, не создавая группу доли.

Пример SDK: DeviceSelectCL показывает, как идентифицировать оффлайновый GPU, не подключенный к дисплею, и затем используйте устройство CL, соответствующее этому GPU.

Следующий код показывает, как выбрать несвязанный GPU. Используя API CGL, выполните итерации по всем доступным средствам рендеринга и запросите каждого для его kCGLRPOnline, kCGLRPAcceleratedCompute, и kCGLRPRendererID, затем определите средство рендеринга ID, который является и оффлайн и поддерживает ускоренный, вычислите:

Перечисление 2  , Выбирающее несвязанный GPU

CGLRendererInfoObj rend;
GLint nrend = 0;
GLint nonDisplayGPURendererID = 0x0;
CGLQueryRendererInfo(0xffffffff, &rend, &nrend);
for(GLint idx=0; idx<nrend; idx++) {
    GLint online = 1;
    CGLDescribeRenderer(rend, idx, kCGLRPOnline, &online);
    if(!online) {
        GLint accelerated = 0;
        CGLDescribeRenderer(rend, idx, kCGLRPAcceleratedCompute, &accelerated);
        if(accelerated) {
                CGLDescribeRenderer(rend, idx, kCGLRPRendererID,
                                                        &nonDisplayGPURendererID);
                break;
            }
        }
    }
CGLDestroyRendererInfo(rend);

Для GPUs, поддерживающих OpenCL в Mac OS X, rendererID может быть преобразован в cl_device_id путем маскирования далеко младшего байта:

Перечисление 3  , Преобразовывающее средство рендеринга ID в cl_device_id

cl_device_id nonDisplayCLDeviceId = (cl_device_id)(intptr_t)(nonDisplayGPURendererID&~0xff);

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

Выбор GPU when using CL/GL Sharing

Приложения, совместно использующие ресурсы между OpenCL и OpenGL путем создания контекста CL из CGLSharegroup, могут использовать расширение OpenCL для определения, какое устройство подключено к дисплею. Эти приложения могут также использовать механизм API CGL, описанный в предыдущем разделе.

Пример SDK: DeviceSelectCLGL показывает, как идентифицировать оффлайновый GPU, не подключенный к дисплею.

Приложение создаст контекст CL из CGL sharegroup, с помощью следующего кода:

Перечисление 4  , Создающее CGL sharegroup и контекст CL

CGLShareGroupObj sharegroup = CGLGetShareGroup(self.view.openGLContext.CGLContextObj);
 
cl_context_properties props[] = {
  CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE,
  (cl_context_properties)sharegroup,
  0
};
 
cl_int err;
ctx = clCreateContext(props, 0, NULL, NULL, NULL, &err);

CGL sharegroup должен включать оффлайновые средства рендеринга. В базируемом приложении NSOpenGLView этот выбор выполняется в InterfaceBuilder. В других приложениях вызовите CGLChoosePixelFormat со списком атрибутов включая атрибут kCGLPFAAllowOfflineRenderers.

Контекст CL будет содержать все устройства GPU в sharegroup та поддержка OpenCL. Если Вы хотите включать устройство OpenCL CPU в контекст, передайте его clCreateContext в массиве с третьим параметром.

Можно использовать функцию clGetGLContextInfoAPPLE, чтобы запросить cl_device_id, соответствующий текущему виртуальному экрану и затем сравнить это значение с другими устройствами в контексте для различения, дисплей соединил GPU.

Перечисление 5  , Запрашивающее для связанного GPU с текущим виртуальным экраном приложения

cl_device_id displayDevice;
clGetGLContextInfoAPPLE(ctx,self.view.openGLContext.CGLContextObj,
    CL_CGL_DEVICE_FOR_CURRENT_VIRTUAL_SCREEN_APPLE, sizeof(displayDevice), &displayDevice, NULL);


История версии документа


ДатаПримечания
18.04.2014

Новый документ, описывающий, как выбрать GPU in CL-only или приложения CL/GL на Mac Pro (В конце 2013)