OpenCL: хорошо ли он работает с OpenMP, я могу подключить к нему другие языки и т.д.

Спецификация 1.0 для OpenCL появилась всего несколько дней назад (Spec здесь), и я только начал ее читать. Я хочу знать, хорошо ли он хорошо работает с другими высокопроизводительными API многопроцессорности, такими как OpenMP (spec), и я хочу знать, что я должен изучить. Итак, вот основные вопросы:

  • Если я уже использую OpenMP, это нарушит OpenCL или наоборот?
  • Является ли OpenCL более мощным, чем OpenMP? Или они предназначены для дополнения?
  • Существует ли стандартный способ подключения программы OpenCL к стандартной программе C99 (или любому другому языку)? Что это?
  • Кто-нибудь знает, пишет ли кто-нибудь книгу OpenCL? Я читаю спецификацию, но я нашел книги более полезными.

Ответ 1

OpenMP и OpenCL отличаются, но могут быть созданы для совместной работы. Ни один из них не должен "ломать" другой.

Для аргумента допустим, что существует компромисс между минимизацией изменений существующей базы кода и производительностью или вычислительной мощностью. OMP "легко" в том, что вы можете применить его "магически" к неловко параллельным проблемам с быстрой прагмой или двумя.

OpenCL представляет совершенно новые концепции высокого уровня за пределами типичных моделей потоковой обработки ОС. Хронос, вероятно, не хочет говорить об этом вслух, но его генезис находится в NVIDIA CUDA. Если вы хотите посмотреть, как это работает сегодня, загрузите SDK CUDA и начните играть. Если у вас нет графических процессоров NVIDIA, не беспокойтесь, есть опция программного обеспечения для эмулятора GPU. OpenCL - это удобная абстракция графического процессора, который должен применяться к процессорам, DSP, "ускорителям" (прозвище Khronos для IBM CellBE и, возможно, Intel Larrabee).

OpenCL не должен быть "написан непосредственно на C99". Он упоминается как расширение C99, поскольку его синтаксис аналогичен/идентичен C99 с некоторыми новыми ключевыми словами. Вы не можете вызвать libc (или любую другую библиотеку) из ядра.

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

См. также:

Ответ 2

По большей части OpenMP и OpenCL независимы друг от друга. Это оба способа предоставить разработчику доступ к parallelism на своей платформе.

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

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

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

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

Другая большая вещь, о которой нужно подумать, - это то, как вы планируете планировать задачи, выполняемые на сопроцессоре. Это правда, что вы можете накормить много работы на одном из современных графических процессоров, но есть много вещей, о которых нужно подумать с использованием конвейера и памяти. То, что вы не хотели бы иметь, - это иметь 8 разных потоков OpenMP, каждый из которых пытается отправить свою собственную работу на Co-Processor одновременно. Я бы рекомендовал иметь только один поток, который управляет всеми взаимодействиями с Co-Processor, поэтому он может быть уверен, что он будет эффективно работать.

Тем не менее, я уверен, что есть программы, которые одновременно выполняют несколько типов задач, когда один тип задачи всегда можно обрабатывать в Co-Processor, а другой вид задачи может быть обработан многоядерный основной процессор. Это был бы прекрасный пример времени для объединения OpenMP и OpenCL.

Удачи!

Ответ 3

  • OpenCL должен быть написан непосредственно в C99 afaik? Теперь есть файлы заголовков для него.

Ответ 4

Кстати, есть работа о openMp для gpgpu с использованием CUDA.