Когда использовать OpenCL?

Наткнувшись на эту тему, dot быстрее на процессор, чем на gpu, используя OpenCL, мне снова напомнили, что есть экземпляры, которые выглядят так, как будто они созданы для OpenCL *, но там, где они используются, OpenCL не дает нам выигрыша. то есть у меня также есть реализация kmeans с использованием кода pyopencl, который в несколько раз быстрее, чем простой код python, но все же в несколько раз быстрее, чем функция scipy для kmeans.

Итак, как вы решаете, когда использовать OpenCL?

  • Какая видеокарта вам нужна? Насколько "лучше, чем процессор", нужна графическая карта. Является ли Quadro FX 580 против i7 860 достаточно?
  • Насколько велика проблема? Вам нужны миллионы умножений, чтобы получить что-то или достаточно нескольких сотен?
  • Насколько оптимизирован даже "простой" алгоритм, такой как kmeans или точечный продукт, чтобы сделать OpenCL стоящим?

Или это один из этих случаев треугольника, где вы можете (или должны) выбрать два из трех углов, чтобы заставить его работать?

    problem size
        /\
       /  \
      /    \
     /      \
    /________\
GPU/CPU   optimization

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

Спасибо.

* простая матричная операция, такая как точка-произведение, kmeans или матричные умножения.

Ответы

Ответ 1

Настоящий ключ должен состоять в том, должен ли ваш алгоритм содержать встроенную распараллеливание, где вы можете передать набор данных и иметь на нем значительное количество параллельной обработки. Помните, что у GPU может быть много ядер, но каждый из них только часы .5-1GHZ. Сила заключается в обработке больших объемов параллельных операций, чтобы получить чрезвычайно высокую пропускную способность.

Рассмотрим пропускную способность как (вычисляемая по данным * частота * этапы конвейера) - так что будет компромисс между 1/6-й частотой с одним из этих ядер GPU, но, вероятно, более 6 * количеством ядер ( трубопроводы).

Конечно, есть дополнительные накладные расходы на CPU ↔ GPU барьер, а также ваш алгоритм может привести к множеству циклов GPU для вычисления.

Ответ 2

Несколько элементов ответа:

  • Точечный продукт не подходит для работы на графическом процессоре, поскольку он по существу является сокращением, требующим синхронизации между потоками.
  • Любой "недавний" графический процессор будет в порядке: NVIDIA GTX 2xx, ATI/AMD HD5xxx или более поздняя версия лучше всего подходят для использования OpenCL.
  • Перемещение данных в/из графического процессора происходит медленно, как правило, 6 ГБ/с в лучшем случае. Если данные вписываются в кеш процессора, процессор, вероятно, будет быстрее, если только значение вычисления /IO задачи не будет большим.
  • Эффективный код для простых алгоритмов можно найти в образцах кода AMD/NVIDIA и на разных веб-сайтах. Для других алгоритмов поиск правильного дизайна и оптимизация кода может занять некоторое время. После некоторого момента оптимизация специфична для каждой микроархитектуры и требует еще больше времени.

Ответ 3

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

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

С другой стороны вам нужно обратить внимание на некоторые выигрыши OpenCL. Нужно скопировать некоторые данные из RAM в GPU и обратно, что приводит к некоторым задержкам. Вы должны сделать некоторые измерения времени различных размеров проблем на процессоре и графическом процессоре. Вы легко увидите, когда достигнут разрыв. Я попробовал матричное умножение с библиотекой ATLAS на процессоре Opteron X64 2x2600 и GPU Geforce 8600GTS. Матричное умножение было всего двумя матрицами с размерами NxN. Разрыв был для N примерно около 100. Этот результат в значительной степени зависит от используемого процессора и графического процессора и может отличаться от других аппаратных средств.

Ответ 4

GPU - все о обработке данных, где происходят интенсивные вычисления. Вы можете отключить CPU, поместив свои интенсивные задачи на GPU. Полученные вами результаты зависят от вас, так как GPU - это всего лишь инструмент, он требует "правильного" использования.