OpenCL и оптимизация

OpenCL появился относительно недавно, но уверенно завоевывает сердца и умы разработчиков. Некоторое время назад Интел выпустил собственную реализацию OpenCL – Intel® OpenCL SDK. Проект активно развивается и в данный момент на домашней странице проекта доступна для скачивания версия 1.1.

Оптимизация для OpenCL – достаточно трудоемкое дело, на эту тему можно защитить диссертацию, написать книгу-бестселлер и сказочно разбогатеть ;) . Я же начну свой путь к богатству скромно, c поста в блоге. Ниже предполагается, что у читателя уже есть базовое представление об OpenCL, SDK загружен и Hello World написан.

Сегодня хотелось бы отметить приложение, которое поставляется с Intel® OpenCL SDK и имя ему Intel® OpenCL Offline Compiler (x64).

Можно найти несколько реальных применений этому приложению, основная цель которого – компиляция исходного OpenCL кода в код, который OpenCL runtime часть уже способна исполнять.

Сам Offline Compiler выглядит так:

Intel® OpenCL Offline Compiler

Пример Offline Compiler с загруженым OpenCL кодом.

OpenCL код (слева) после компиляции (в нижнем окне виден отчет о успешной или не очень компиляции) можно просмотреть в виде некого LLVM (Low Level Virtual Machine) байт-кода, или в более традиционном виде x86 ассемблерных инструкции (справа).

На что в этом топике хотелось бы обратить внимание, – наш изначальный код ( addLevel2 ) в виде инструкций уже показан в двух версиях. В обеих – функционально полный и правильный:



    • простой ( @addLevel2 ) скалярный/поэлементный.

    • более продвинутый (@__Vectorized_AddLevel2 ) векторизованный.



Получается, что компилятор уже на данном уровне пытается создать два пути для кода. А вот выбор варианта, т.е. какой именно путь будет использован во время исполнения программы, лежит на плечах эвристики и в момент исполнения.

Таким образом, довольно быстро, на этапе написания, можно оценить потенциальные возможности и производительность кода. Ведь мы знаем, что векторизация, как правило, приносит значительное ускорение по сравнению с поэлементными операциями.

Надеюсь, у вас уже появились вопросы по OpenCL. Не стесняйтесь оставлять их в комментариях – обсудим!

For more complete information about compiler optimizations, see our Optimization Notice.