По большей части OpenMP и OpenCL независимы друг от друга. Оба эти способа предоставляют разработчику доступ к параллелизму на их платформе.
OpenMP хорошо работает с несколькими (одинаковыми) процессорами, где примерно одинаковая работа может (почти) автоматически распределяться между ними.
OpenCL - немного другой зверь в том смысле, что он действительно великолепен при работе со специальным сопроцессорным оборудованием. Это позволит вам перегрузить некоторые из сверхмощных вычислений числа в GPU или другой сопроцессор, такой как в Cell. Тем не менее, он также был построен с идеей, что он может быть использован для использования других основных процессоров, как это принято сейчас в многоядерных компьютерах. Я бы посчитал эту функцию второстепенной, и если это все, для чего вы собираетесь использовать OpenCL, я бы не рекомендовал использовать OpenCL.
Тем не менее, я предполагаю, что это будет несколько сложно, хотя определенно не невозможно заставить OpenMP и OpenCL работать вместе в одной и той же проблеме.
Первое, о чем нужно подумать, это то, что вы делаете для OpenCL. Это определенно тот случай, когда вы бы хотели, чтобы OpenCL работал только на GPU / Co-процессоре ... а не на других основных процессорах / ядрах, поскольку OpenMP уже использует их. Это не будет (не должно) вызывать ошибки приложения для запуска OpenCL и OpenMP на одном и том же главном процессоре, но это приведет к нежелательному планированию, когда и OpenMP, и OpenCL работают медленнее, потому что они тратят большую часть своего времени на переключение обратно и четвертый между собой. Это также может произойти, если вы одновременно запустите любой процесс, требующий ресурсов процессора, на том же ядре.
Еще одна важная вещь, о которой стоит подумать, это то, как вы собираетесь планировать задачи, которые выполняются на сопроцессоре. Это правда, что вы можете выполнять большую часть работы в одном из современных графических процессоров, но есть много вещей, о которых стоит подумать, используя конвейер и использование памяти. Чего бы вы не хотели - это иметь 8 различных потоков OpenMP, каждый из которых пытается одновременно отправить свою работу на сопроцессор. Я бы порекомендовал иметь только один поток, который управляет всеми взаимодействиями с сопроцессором, чтобы он мог обеспечить эффективную работу.
Тем не менее, я уверен, что есть программы, которые имеют несколько типов задач, выполняющихся одновременно, где один тип задачи всегда может быть передан на сопроцессор, а другой тип задачи может быть обработан многоядерный основной процессор. Это был бы прекрасный пример того, как можно смешать OpenMP и OpenCL.
Удачи!