В мире высокопроизводительных вычислений (HPC) переносимость производительности — цель, которую преследуют многие разработчики. Однако с диверсификацией вычислительных платформ эта цель сталкивается со многими проблемами. Переносимость производительности — это не только возможность запуска приложения на разных аппаратных платформах, но, что более важно, то, как поддерживать его совместимость без ущерба для производительности. На сегодняшний день не существует универсальных стандартов количественного определения и оценки производительности переносимости, что затрудняет разработку программного обеспечения для разработчиков.
Переносимость производительности предполагает, что единая база кода разработчика сможет хорошо работать на новых архитектурах и поддерживать приемлемые ограничения производительности на различных текущих архитектурах, которые еще не были протестированы.
Определение и измерение переносимости производительности вызывают горячие споры. Некоторые утверждают, что это прежде всего переносимость приложений, в то время как другие настаивают на том, что переносимость исходного кода является ключевым моментом. Особенно в условиях нынешнего быстрого развития аппаратного обеспечения разработчикам необходимо подумать о том, как заставить свои продукты продолжать работать на нескольких платформах. Программа суперкомпьютеров (ECP) Министерства энергетики США подчеркивает этот момент, поскольку им необходимо создать совместимые вычислительные экосистемы для различных аппаратных архитектур.
Принято считать, что «код может хорошо работать на нескольких архитектурах, это и есть переносимость производительности».
При оценке переносимости производительности разработчики обычно учитывают два фактора: переносимость и производительность. Переносимость можно измерить, исследуя строки кода, используемые в разных архитектурах, а производительность можно определить, сравнив результаты запуска оптимизированной для платформы версии с портативной версией. Несмотря на эти методы измерения, в отрасли по-прежнему отсутствуют прозрачные стандарты, что не позволяет разработчикам четко понимать, как добиться оптимальной портативности производительности.
На конференции Министерства энергетики США по портативности в 2016 году участники развернули острую дискуссию по вопросу переносимости производительности. Многие известные разработчики и ученые посетили конференцию, чтобы поделиться новыми идеями и потребностями в переносимости производительности. Стоит отметить, что есть аргумент в пользу того, что будущие модели параллельного программирования обеспечат более значительную переносимость производительности, чем могут обеспечить сами приложения.
Как упоминалось на совещании: «Код является переносимым по производительности, если команда приложения считает, что он переносим по производительности».
Столкнувшись с разнообразием аппаратных платформ, разработчикам необходимо найти подходящие платформы для поддержки своего кода. Некоторые известные платформы, такие как OpenCL, SYCL и OpenMP, утверждают, что способствуют функциональной переносимости. Эти платформы поддерживают многоплатформенное параллельное программирование, что позволяет разработчикам программировать на нескольких языках. Однако помимо фреймворков существуют и нефреймворковые решения, такие как самонастраивающиеся и предметно-ориентированные языки, которые также могут помочь улучшить переносимость производительности.
Короче говоря, вопрос переносимости производительности становится все более важным в высокопроизводительных вычислениях, поскольку он напрямую влияет на эффективность работы разработчиков и устойчивое развитие приложений. Поскольку требования к вычислениям в будущем меняются, а компьютерные технологии быстро развиваются, как разработчикам следует адаптироваться к этим проблемам и решать их?