BC/NW 2013, №2 (23):3.1

 

ЦИКЛ РАЗРАБОТКИ CUDA ПРИЛОЖЕНИЙ

Абрамов И. В.

(ФГБОУ ВПО  "Национальный исследовательский университет "МЭИ",

 

APOD (Assess, Parallelize, Optimize, Deploy) - цикл разработки приложений CUDA [1], цель которого помочь разработчикам приложений быстро выявить части своего программного кода, из которых можно извлечь выгоду с помощью ускорения на GPU, быстро понять выгоду от использования CUDA и начать использовать полученные возможности ускорения при решении реальных задач как можно раньше.

APOD это итеративный процесс (рис. 1): начальное ускорение может быть достигнуто, испытано и развернуто с минимальными начальными затратами времени, после чего цикл может начаться снова путем выявления дополнительных возможностей оптимизации, рассматривая возможные дополнительные ускорения, и затем развертывания еще более быстрых версий приложения в производство.

Assess, Parallelize, Optimize, Deploy.

Рис. 1. APOD – итеративный процесс

Assess (оценка)

     Для существующего проекта первым шагом оценки приложения является обнаружение частей кода, которые выполняются за наибольшее время. Получив эти знания, разработчик может оценить эти узкие места для возможности распараллеливания и начать исследовать возможности ускорения с использованием GPU. Понимая требования конечных пользователей и ограничения, и применяя законы Амдала и Густафсона, разработчик может определить верхнюю границу улучшения производительности от ускорения выявленных узких мест приложения.

Parallelize (распараллеливание)

     После определения узких мест, разработчику требуется распараллелить исходный код приложения. В зависимости от исходного кода, это может быть сделано простым вызовом существующих оптимизированных библиотек для GPU, таких как cuBLAS, cuFFT, или Thrust, или для этого потребуется всего лишь добавить несколько директив препроцессора в качестве подсказок для распараллеливания компилятором. С другой стороны, некоторые приложения могут потребовать некоторой реорганизации исходного кода, чтобы раскрыть их возможности распараллеливания.

     Поскольку, даже для последующих архитектур CPU потребуется раскрывать этот параллелизм в целях улучшения или просто поддерживания производительности последовательных приложений, семейство параллельных языков CUDA (CUDA C/C++, CUDA Fortran и т.д.) нацелено на выражение этого параллелизма как можно более простым, одновременно обеспечивая работу на CUDA-совместимых GPU, разработанных для  пропускной способности размером в максимальное количество программных потоков.

Optimize (оптимизация)

     После завершения каждого этапа распараллеливания, разработчик может перейти к оптимизации реализации для повышения производительности. Поскольку существует много методов оптимизации, которые можно рассматривать, хорошее понимание потребностей приложения может помочь сделать процесс оптимизации максимально гладким. Однако, как и APOD в целом, оптимизация программы это итеративный процесс (требуется идентифицировать возможности для оптимизации, применять и тестировать оптимизацию, проверять какое ускорение достигнуто, и так далее по кругу), это означает, что для программиста не является необходимым тратить много времени на запоминание всех возможных методов оптимизации до наблюдения хорошего ускорения. Вместо этого методы оптимизации могут быть применены по мере их изучения.

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

Deploy (развертывание)

     После завершения работ по ускорению приложению с помощью GPU одного или более компонентов приложения можно сравнить полученные результаты с начальными ожиданиями. Напомним, что первый шаг (оценка) позволило разработчику определять верхнюю границу для потенциально возможного ускорения работы приложения, достигаемую в результате ускорения работы узких мест приложения. Прежде чем приступить к другим узким местам, чтобы улучшить общее ускорение работы приложения, разработчик должен рассмотреть вопрос о частичном распараллеливании реализации приложения и доведении ее до производства. Это важно по ряду причин. Например, это позволяет получить выгоду от работы по ускорению приложения как можно раньше (ускорение может быть частичным, но все же ценным), и сводит к минимуму риск для разработчиков и пользователей, предоставляя эволюционный, а не революционный набор изменений в приложении.

Литература

1.     Практические рекомендации по работе с CUDA.

http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/