Бенчмарк OpenCL

#benchmarking #opencl

#сравнительный анализ #opencl

Вопрос:

Я могу много читать об OpenCL, и он кажется наиболее многообещающим (единственным?) библиотека с несколькими архитектурами. OpenCL должен стать первым стандартом программирования на параллельной архитектуре, и в конечном итоге он будет принят большинством программистов. Это хорошо, хорошо, но есть ли потеря производительности при переходе из собственной библиотеки программирования в OpenCL? В случае с nVidia GeForces я уже нашел статью, в которой сравнивались две реализации одной и той же программы — CUDA и OpenCL code, и первая показалась более производительной. В случае потоков Pthread или Windows я действительно понятия не имею, но я думаю, что «общность» и подход с несколькими архитектурами всегда будут чем-то «платить». Просто чтобы перестать размышлять о том или ином, я хотел бы проверить все сам, но мне нужна ваша помощь! Существует ли общепринятый набор тестов OpenCL, который я могу использовать для сравнения с машинным кодом? Существует ли аналог CUDA SDK, написанный в коде OpenCL? Спасибо всем.

Комментарии:

1. если какой-либо из приведенных ниже ответов отвечает на ваш вопрос, поставьте ему зеленую галочку

Ответ №1:

Не будучи экспертом по производительности / бенчмаркингу, я могу только попытаться дать вам несколько общих мыслей о OpenCL против CUDA. Справедливое предупреждение, однако, я могу что-то неправильно понять.

Очевидно, что проблема с бенчмарками заключается в том, что вы можете объективно оценивать только очень конкретные вещи — скажем, одну и ту же программу, выполненную в CUDA и OpenCL, на том же оборудовании (как вы назвали источник). Но вы не сможете вывести из этого эксперимента, что вы получите аналогичные результаты в другой программе или с другим оборудованием. Результаты будут отличаться, поэтому вам потребуется большой набор тестов. Это то, о чем вы просите, но я не знаю ничего подобного в существовании — люди выберут любую технологию для своих более крупных проектов и не будут писать все дважды.

Есть примеры кода NVIDIA, выполненные как на CUDA, так и на OpenCL. Вы можете выбрать несколько и сравнить свои результаты.

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

  • будет ли оптимальный код использовать всю доступную пропускную способность памяти
  • будет ли компилятор создавать эффективный код
  • можете ли вы использовать все вычислительные единицы
  • и так далее…

Из моих тестов ответ на эти вопросы — будет ли мой код оптимально использовать аппаратное обеспечение — положительный для обеих фреймворков. Таким образом, они определенно играют в одной лиге, и даже если один из них на 5% быстрее другого для какой-то конкретной проблемы на данный момент, я думаю, что это не повлияет на общее представление.

Я намеренно ничего не писал о других вариантах использования OpenCL, например, на процессорах. Это поле намного шире, поскольку у вас разные операционные системы, даже разные OpenCL SDK для одних и тех же процессоров (например, Apple и Intel) и множество способов параллельного программирования без OpenCL (для сравнения).

Комментарии:

1. Большое спасибо. Я согласен со всем, что вы написали, но у меня есть некоторые конкретные проблемы, которые нужно решить. Я знаю, что ускорение на 5% в целом не является значительным ускорением, но теперь я спрашиваю себя: «Хорошо, я должен выполнить это вычисление. Какое оборудование и какую библиотеку я собираюсь использовать? » Очевидно, я выберу более быстрое решение. Размер моей проблемы не задан, и, возможно, эти 5% разницы в производительности могут стать «важными». Итак, большое спасибо за ваш ответ, я изучу OpenCL-версию nVidia examples.

2. @biagiop1986: нужно учитывать не только производительность. Имейте в виду, что код CUDA выполняется только на устройствах NVIDIA, а код OpenCL может выполняться на множестве устройств, ВКЛЮЧАЯ устройства NVIDIA. Это не ситуация «при прочих равных условиях». Если вы не собираетесь запускать код один раз и он вам больше никогда не понадобится, рассмотрение совместимости оборудования может быть действительно важным. Что происходит, когда AMD выпускает новую действительно быструю карту? Или NVIDIA разоряется? Многое можно сказать о коде, не зависящем от аппаратного обеспечения.

Ответ №2:

В настоящее время нет установленных тестов производительности для тестирования скоростей различных фреймворков. Создано несколько бенчмарков. Известные примеры включают набор тестов SHOC и Rodinia. На горизонте, вероятно, скоро будут выпущены OpenCL и 13 Dwarves, которые могут быть полезны для целей бенчмаркинга.

Для проведения тестирования между фреймворками была проделана работа по тестированию различий между OpenCL и CUDA с точки зрения производительности. Часть этой работы включает понимание того, что для OpenCL, несмотря на переносимость корректности, нет гарантии переносимости производительности. В своей диссертации Дага подчеркивает важность оптимизации с учетом архитектуры.

Комментарии:

1. SHOC — довольно отличный бенчмарк, разработанный Национальной лабораторией Окриджа. Вот статья о проводах HPC, которая, по моему мнению, была довольно хорошей: hpcwire.com/hpcwire/2012-02-28/opencl_gains_ground_on_cuda.html

Ответ №3:

Вообще говоря, OpenCL и CUDA получают одинаковую производительность. Не существует надлежащих тестов, потому что просто невозможно сравнивать разные аппаратные средства и архитектуры.

Если вы планируете написать приложение на базе графического процессора и просто хотите знать, какое из них вам следует выбрать. Не решайте одно или другое только из-за скорости. По сравнению с реализацией процессора OCL и CUDA дадут ускорение x100-x300.

Мой совет:

  • Если вы собираетесь создавать приложение высокого уровня, и вам нужно много библиотек, вероятно, следует использовать CUDA, поскольку у него лучший SDK и поддержка.
  • Если вы собираетесь создавать низкоуровневое приложение и будете писать весь код с нуля, используйте OpenCL, поскольку он будет поддерживать почти все будущие аппаратные средства (CPU и GPU). Есть также некоторые библиотеки, которые вы можете использовать, но они не так хороши, как CUDA.

Ответ №4:

К этому следует относиться с недоверием:

http://clbenchmark.com/result.jsp

Поскольку карты NVidia могут иметь меньшую поддержку OpenCL, чем CUDA, они могут быть оценены лучше с эквивалентными программами CUDA.