Если выбор в пользу систем с гибридной архитектурой сделан и принято решение переносить существующее ПО на платформы с графическими ускорителями, то исполнителю предстоит выполнить следующие действия:
- Шаг 1. Провести профилировку приложения. Очевидно, что на GPU потребуется переносить не всю программу, а только самые узкие ее места, выявление которых позволяет не только очертить фронт работ, но и спрогнозировать достижимое ускорение.
- Шаг 2. Внесение изменений в алгоритм и структуры данных. В большинстве случаев, если программа уже имеет параллельную архитектуру, потребуется лишь немного переделать все структуры и классы (с целью перехода от паттерна Array-Of-Structures к Structure-Of-Arrays) и слегка «подправить» алгоритм. Однако если в ПО отсутствует параллелизм нужной степени, то придётся привлекать «специалиста-предметника» и выбирать новые, хотя и похожие на имеющийся алгоритмы.
- Шаг 3. Портировать на GPU все «узкие места» программы, а также небольшую часть «общего» кода, так как в большинстве программ между вызовами «тяжёлых» ядер производится определенная подготовка данных. И если её целиком оставить на центральном процессоре, это вызовет многочисленные пересылки вида CPU↔GPU, что в общем случае эквивалентно потере 20-50%, а то и большей доли производительности.
- Шаг 4. Провести «глубокую» оптимизацию проблемных GPGPU-ядер. Если достигнутое ускорение оказалось недостаточным, то благодаря гибкости архитектуры CUDA у разработчика имеется множество способов его повышения: асинхронное копирование, подстройка ядер под конкретную модель GPU, использование динамической разделяемой памяти и др. Но прибегать к этим методам следует только для «проблемных» ядер, ставших новыми «узкими местами» программы.
- Шаг 5. Провести анализ эффективности портированного ПО. Этот шаг – ключевой для принятия решения о покупке нового «железа» под новое ПО. Важно, например, оценить, что выгоднее: приобрести два двухпроцессорных узла, каждый с тремя картами NVIDIA Tesla, или четыре однопроцессорных, каждый из которых будет иметь лишь две такие карты? Без дополнительных тестов здесь не обойтись, но экономия нескольких тысяч, а то и десятков тысяч долларов в большинстве случаев оправдывает затраты на тестирование.
Специалисты нашей компании могут провести весь описанный комплекс работ либо выполнить любую его часть, если квалификация предыдущего исполнителя оказалось недостаточной. Опыт, накопленный нами в области оптимизации ПО под GPGPU, нашел воплощение в наборе вспомогательных библиотек, в результате чего для каждого шага мы бесплатно предлагаем реализацию дополнительной эксклюзивной функциональности.
Например, после выполнения «Шага 1» Заказчик получает сборку программы, которая по завершении работы формирует и сразу же выдает html-отчёт с прогнозом ускорения GPU-версии относительно текущей системы. А на «Шаге 4» мы производим встраивание библиотеки ttgLib, которая – благодаря динамической оптимизации и подстройки программы к обрабатываемым данным – автоматически повысит скорость выполнения ПО дополнительно на 10-50%.