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

Включение многопоточного выполнения платформы OpenGL

OpenGL в основанных на Intel системах Macintosh может использовать многопоточность для увеличения производительности ограниченных CPU основанных на OpenGL приложений.

Введение
Как это Работы
Доступность
Включить многопоточное выполнение OpenGL:
Получение лучшей производительности с OpenGL Многопоточное выполнение:
См. также
История версии документа

Введение

Максимизация производительности OpenGL Вашего приложения путем поточной обработки графического кода технически сложна. OpenGL в основанных на Intel системах Macintosh может использовать в своих интересах возможности многопоточности Mac OS X выполнить части платформы OpenGL на втором потоке. Когда используется соответственно, этот многопоточный подход может увеличить производительность ограниченных CPU приложений OpenGL. Эти Технические замечания описывают требования для многопоточного выполнения OpenGL и как включить его в Вашем приложении.

Как это Работы

Когда Ваше приложение вызывает OpenGL API, базовая платформа OpenGL тратит циклы, управляющие состоянием и создающие инструкции для GPU. Обычно эта работа обнаруживается как время, проведенное на основном потоке Вашего приложения. Также, Ваше приложение будет блокировано, ожидая платформы OpenGL для возврата.

При включении многопоточного выполнения OpenGL в приложении часть времени выполнения, проведенного в платформе OpenGL, передается второму потоку. Второй поток будет оптимально работать на одном из доступных ядер CPU. Так как часть рабочей нагрузки платформы OpenGL была параллелизирована, вызовы OpenGL возвратят управление Вашему приложению раньше, и больше циклов CPU будет доступно для его основного потока.

  Значение по умолчанию рисунка 1 по сравнению с многопоточным выполнением OpenGL

В сценарии выполнения, показанном на рисунке 1, основной поток оставляют прежде всего с режимами работы представления команды, в то время как второй поток обрабатывает более тяжелую задачу фактической обработки команды OpenGL, включающей управление GPU. Этот второй поток имеет преимущество наличия его собственного ядра CPU для выполнения на.

Доступность

Mac OS X 10.4.7 или позже системы Мак Про Макинтоша и 10.4.8 - или позже для других основанных на Intel компьютеров Макинтоша.

Включить многопоточное выполнение OpenGL:

Параметр контекста CGL kCGLCEMPEngine константа, которую Вы используете, чтобы включить и отключить многопоточное выполнение. Для включения его передайте текущий контекст CGL вместе с этим параметром к функции CGLEnable. Для отключения его передайте текущий контекст CGL вместе с этим параметром к функции CGLDisable. Перечисление 1 показывает, как включить многопоточное выполнение.

Код вызывает функцию CGL CGLEnable передача текущего контекста и параметра контекста kCGLCEMPEngine. Отметьте проверку ошибок. Это - важный шаг, потому что OpenGL, многопоточное выполнение не обязательно доступно на всех компьютерах, имеющих многократные ядра.

Перечисление 1  , Разрешающее многопоточное выполнение OpenGL

#include <OpenGL/OpenGL.h>

CGLError err = 0;
CGLContextObj ctx = CGLGetCurrentContext();
     
// Enable the multi-threading
err = CGLEnable( ctx, kCGLCEMPEngine);
     
if (err != kCGLNoError )
{
     // Multi-threaded execution is possibly not available
     // Insert your code to take appropriate action
}   

Является OpenGL Многопоточным Правом исполнения для моего Приложения?

Включение многопоточного выполнения не гарантирует увеличения производительности для всех приложений. Ваше приложение наиболее вероятно не получит преимущества если это:

  • Не ограничивается скоростью или вычислительной мощностью единственного CPU

  • Имеет много времени для всех операций OpenGL

  • Заливка, ограниченная GPU

  • Часто вызывает функции OpenGL, требующие синхронизации. Посмотрите раздел названное “Получение лучшей производительности с OpenGL многопоточное выполнение”

Ваше приложение, вероятно, получит преимущества если это:

  • Ограничивается скоростью или вычислительной мощностью единственного CPU

  • Не требует большой синхронизации данных или извлечения от OpenGL (glGet*, glPopAttrib, glFinish, и т.д.).

Если Ваше приложение является кандидатом на использование OpenGL многопоточное выполнение, знают о следующих проблемах:

  • Увеличенный наверху во время синхронизации между CPU и GPU

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

Получение лучшей производительности с OpenGL Многопоточное выполнение:

Для получения максимальной производительности с OpenGL многопоточное выполнение следуйте этим инструкциям:

См. Руководство по программированию OpenGL для Mac OS X для большего количества подробных данных.

См. также

Для получения дополнительной информации см. «Улучшающуюся Производительность» в Руководстве по программированию OpenGL для Mac OS X. Несмотря на то, что все подсказки по методам наиболее успешной практики в той главе помогут настроить Ваше приложение, подсказки относительно асинхронного использования CPU и GPU особенно важны для любого приложения с помощью OpenGL многопоточное выполнение.

CGLEnable и CGLDisable вызовы являются частью Ядра OpenGL или CGL для краткости См. Справочная документация CGL для большего количества подробных данных.



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


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

Новый документ, что openGL в основанных на Intel системах Macintosh может использовать многопоточность для увеличения производительности ограниченных CPU основанных на OpenGL приложений.