Разработка на Java и OpenCL: Дорога в облака



В статье рассматривается использование платформы Java для разработки совместно с OpenCL, преимущества и недостатки этого подхода. Сочетание этих технологий в разработке ПО в перспективе позволит использовать всю мощь облачных вычислений и OpenCL

В последнее время набирает популярность разработка программного обеспечения для серийно выпускаемых вычислительных устройст с высокой степенью параллелизма. Это современные многоядерные процессоры с SIMD коммандами и видеоускорители с поддержкой GPGPU (General-purpose computations on GPU), устройства сочитающие центральный и графический сопроцессор на одном кристале AMD Fusion, а так же специализированные сопроцессоры. Почти у каждого типа устройств своя система комманд, архитектурные особенности и разработка приложений ранее требовала от разработчика знаний нескольких языков программирования и API (интерфейсов программирования приложений). Все это сильно усложняло программирование, а также делало невозможным или экономически нецелесообразным смену платформы (vendor lock-in). Альянсом производителей аппаратного и программного обеспечения был разработан и стандартизован язык OpenCL, который решает эти проблемы. Это открытый стандарт и существует несколько реализаций от разных производителей аппаратного обеспечения AMD, Intel, Nvidia, IBM и др. под операционные системы Windows, Linux и MacOS.

Под ОС Windows для VisualStudio есть плагины от NVIDIA — Parallel Nsight и gDEBugger от AMD. И если с OpenCL компилятором и runtime средой выполнения для перечисленных ранее операционных систем нет проблем, то со средой разработки под Linux у AMD/Nvidia все гораздо сложнее.

Когда host код — часть кода OpenCL, которая подготавливает данные и координирует работу OpenCL ядер, написана на Java, в ОС Linux/Windows возникают проблемы с отладкой. Если вспомнить успех Java платформы на рынке разработки кросплатформенного серверного ПО, непонятно почему вендоры аппаратного обеспечения до сих пор не разрабатывают средства разработки OpenCL — отладки и профилирования, встроенных в Eclipse IDE, Netbeans IDE, IntelliJ Idea. А пока эти среды разработки не включают готовый инструментарий, упрощающий работу с рассматриваемой технологией, попробуем решить задачи разработки средствами доступными сегодня. Это позволит получить нам конкурентоспособное промышленное решение, оптимизированное для работы на современных вычислительных устройствах.

Преимущества и недостатки при совместном использовании Java и OpenCL


Итак почему стоит использовать платформу Java для разработки host кода для OpenCL? Приведу несколько доводов в пользу такого выбора:


Когда не стоит использовать Java для написания OpenCL host кода:

Итак, решили что наша задача подходит для OpenCL и ее невозможно так же эффективно реализовать используя только язык Java. В то же время хотим использовать преимущества JVM. Перейдем от идеи к реализации.

Технологии


Рекомендую для разработки OpenCL в реализации от AMD, если в перспективе планируется перейти к использованию серверного процессора APU Opteron вместо desktop решения на базе CPU AMD + Radeon HD 5000/6000 или AMD Fusion. JavaCL в качестве API для работы с OpenCL. Используя bridJ для вызова native кода динамической библиотеки OpenCL API, получаем прирост производительности по сравнению с JNA.

Инструментарий отладки: gdb с text user interface или ddd как фронтэнд gdb

Для профилирования кода рекомендую использовать AMD APP Profiler из AMD Accelerated Parallel Processing (APP) SDK, ОС Ubuntu 11.04 с установленным AMD proprietary FGLRX graphics driver для разработки. Разработка может вестись в любой Java IDE, поддерживающей maven проекты. Но поддержку подсветки синтаксиса и компиляции OpenCL функций во время написания кода на данный момент поддерживает только плагин для netbeans. Работа этого плагина оказалась крайне не стабильна.

Создание инфраструктуры для разработки и процесс разработки не отличается от работы с другими java технологиями.

С инструментарием отладки все сложнее, но есть решение и этой проблемы. Среда выполнения OpenCL от AMD позволяет отлаживать ядра при запуске на CPU: ставить точки останова (breakpoint) и отображать значения переменных, в том числе векторных типов float4, int4 и т.п. При этом на центральном процессоре эмулируются функции GPU, например для работы с текстурами. Для интересующихся деталями отладки есть статья об отладке JavaCL и OpenCL под linux. Также автором проекта создана wiki страница про отладку кода ядер из Java. Подробная информация о поддерживаемых расширениях gdb для OpenCL

Для профилирования приложения можно использовать AMD APP Profiler. При запуске в Linux он позволяет собрать статистику о работе OpenCL функций в приложении и сохранить ее в CSV файл для последующего анализа данных в табличном процессоре LibreOffice Calc. Чтобы понять насколько оптимально работает ваш код, нужно интерпретировать значения параметров измеряемых профайлером.

Заключение


В статье рассмотрели преимущества и недостатки разработки программного обеспечения с использованием платформы Java и технологии OpenCL. Благодаря перспективам развития вычислительных устройств в по пути увеличения параллелизма, данный подход в разработке ПО претендует на то чтобы стать одним из основных в разработке высокопроизводительных enterprise и cloud преложений на JVM.
@igor_suhorukov
13.12.2011 05:05 UTC
Первоисточник