Математические библиотеки для OpenCL?

35

Я ищу информацию от всех, кто пытался использовать OpenCL в своем научном коде. Кто-нибудь пробовал (недавно) ViennaCL ? Если да, то как это сравнить с острием ?

Как насчет OCLTools ? Это соответствует обещанию? Если это так, будет ли возможным начать писать математические ядра в OpenCL?

Шон Фарли
источник
1
Я послал короткую записку разработчикам ViennaCL с просьбой помочь с этим.
Арон Ахмадиа
1
Этот вопрос также связан с одним из моих постов scicomp.stackexchange.com/questions/366/future-of-opencl .
Аллан П. Энгсиг-Каруп

Ответы:

26

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

Что касается OpenCL в научном коде: OpenCL предназначен для низкоуровневого API, поэтому очень важно каким-то образом обернуть эту функциональность, чтобы достичь разумной производительности. Более того, как только задействовано несколько вычислительных ядер, код может ОЧЕНЬ испачкаться, если ядро ​​и дескрипторы памяти OpenCL необходимо интенсивно передавать внутри приложения. Я не знаю OCLTools, поэтому не могу сказать, полезны ли они в этом отношении.

Что касается ViennaCL: я глава ViennaCL, поэтому я недавно работал с библиотекой. :-) Далее я рассмотрю запрос на сравнение с cusp в несколько большем объеме, а именно: ViennaCL и математические библиотеки cusp на основе CUDA и MAGMA . Рассматривается только нынешнее состояние, хотя в настоящее время происходит много изменений (по крайней мере, с нашей стороны).

Функциональность . MAGMA предоставляет BLAS-функциональность для плотных матриц через обычные интерфейсы функций. Большая часть этой функциональности также предоставляется с ViennaCL 1.2.0 с использованием перегрузок операторов и другого синтаксического сахара.

Те же три итерационных решателя (CG, BiCGStab, GMRES) предоставляются с Cusp и ViennaCL. Набор предварительных кондиционеров заметно отличается: Cusp предоставляет диагональные, SA-AMG и различные предварительные кондиционеры Bridson. ViennaCL предлагает неполные факторизации LU, диагональные прекондиционеры, а в последнее время различные ароматы AMG и редкие приближенные обратные прекондиционеры. Насколько мне известно, все предварительные кондиционеры для каспов работают исключительно на GPU, в то время как ViennaCL полагается, в частности, на этапе установки на вычисления на базе процессора. В настоящее время число форматов разреженных матриц в CUSP больше: COO, CSR, DIA, ELL, HYB, в то время как ViennaCL 1.2.0 предоставляет COO и CSR.

В ViennaCL есть ряд дополнительных функций, которые не входят ни в MAGMA, ни в cusp: типы структурированных матриц (Circulant, Hankel и т. Д.), Быстрое преобразование Фурье, алгоритмы переупорядочения (например, Cuthill-McKee) и обертки для линейной алгебры. типы из других библиотек.

Спектакль. Большой набор функций и аппаратной поддержки в ViennaCL обычно достигается за счет более низкой производительности по сравнению с реализациями на основе CUDA. Это также отчасти связано с тем, что CUDA адаптирована к архитектуре продуктов NVIDIA, а OpenCL представляет в некотором смысле разумный компромисс между различными многоядерными архитектурами.

В целом, ViennaCL в настоящее время работает медленнее, чем MAGMA, особенно на уровне 3. BLAS. Причиной является различие в фокусе ViennaCL (разреженная вместо плотной линейной алгебры) и, следовательно, более высокая степень оптимизации в MAGMA. В частности, BLAS уровня 3 операции в настоящее время значительно быстрее в MAGMA.

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

Переносимость . Что касается переносимости аппаратного обеспечения, ViennaCL может использовать процессоры и графические процессоры всех основных производителей благодаря OpenCL. Напротив, Cusp и MAGMA полагаются на подходящий графический процессор NVIDIA.

ViennaCL предназначен только для заголовков, может быть скомпилирован на широком спектре компиляторов C ++ и должен быть связан только с библиотекой OpenCL, если требуется поддержка GPU. В принципе, универсальные алгоритмы в ViennaCL также могут использоваться без какой-либо связи OpenCL, в то время как cusp и MAGMA требуют компилятора NVIDIA для компиляции и библиотеки CUDA в целевой системе для выполнения. MAGMA также требует библиотеку BLAS, которая иногда может быть немного трудной для поиска или установки в новой системе.

API . MAGMA предоставляет функциональные интерфейсы в стиле BLAS для функциональности BLAS. Интерфейс C ++ cusp также использует некоторые функции из BLAS, но не перегружает операторы. Поскольку большинство интерфейсов в ViennaCL намеренно похожи на Boost.uBLAS и имеют синтаксический сахар, такой как перегрузки операторов, ViennaCL также предназначен для использования в качестве Boost.uBLAS. Таким образом, в дополнение к простому вызову предопределенного набора операций и алгоритмов наше намерение состоит в том, чтобы сделать переход от чисто процессорного исполнения к коду GPU как можно более простым, даже если нужно использовать нестандартные алгоритмы. В случае, если требуется выделенное ядро ​​OpenCL, есть также платформа для интеграции ваших собственных ядер OpenCL в ViennaCL. Таким образом, ViennaCL стремится гораздо больше квысокая производительность в том смысле, что время, необходимое для реализации новых алгоритмов на графическом процессоре, сводится к минимуму . Эта экономия может значительно перевесить любые потери производительности (если таковые имеются) по сравнению с каспом и MAGMA. (В теме о модульном тестировании также упоминалось, что время разработки кода является ценным ресурсом в науке.)

В моем сравнении, безусловно, есть ряд идеологических проблем (например, CUDA против OpenCL, BLAS-интерфейс против перегрузок операторов), но их обсуждение выходит за рамки первоначального вопроса.

Карл Рупп
источник
3
Привет, Карл, добро пожаловать в SciComp и спасибо за информацию!
Джек Полсон,
1
Я думаю, что важно отметить, что MAGMA не только выполняет BLAS уровня 3, но также предоставляет мозаичные гибридные алгоритмы CPU / GPU для наиболее распространенных разложений, то есть LU, QR и Cholesky, а также ряд решателей для Проблемы собственных значений. Домашняя страница MAGMA ( icl.cs.utk.edu/magma ) содержит более подробную информацию, а также замечательный флаер со всеми перечисленными функциями.
Педро
2

OpenCL можно использовать, однако, отсутствует инфраструктура, например, важные зрелые стандартные математические библиотеки с настроенными де-факто стандартными компонентами линейной алгебры и в некоторой степени хорошие инструменты профилирования, хотя последняя проблема значительно улучшилась для графических процессоров. Это доступно в CUDA на сегодняшний день и может быть частью успеха Nvidia с этой моделью программирования. Тем не менее, OpenCL, кажется, догоняет (медленно).

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

Аллан П. Энгсиг-Каруп
источник
Аллан, я не думаю, что вы отвечаете на вопрос Шона здесь ... Он специально ищет примеры библиотек OpenCL, а не сравнение между ними.
Арон Ахмадиа
Было задано пять вопросов. Мой ответ - это общий ответ на первые 4 и более прямой ответ на последний.
Аллан П. Энгсиг-Каруп
Справедливо, спасибо, что приложили некоторые усилия, чтобы ответить на этот вопрос!
Арон Ахмадиа