Использование OpenACC поверх OpenCL?

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

Теперь у меня возникают сомнения ...

у нас есть OpenCL для ускорения, теперь OpenACC (который очень прост в использовании, просто давая подсказки компилятору). Для ускорения хост-программы мы можем просто указать директивы компилятора, а что если у нас есть ядро? т.е. теперь я хочу написать свой код для GPU (c-language), что мне делать? как OpenCL, мне нужно писать example.c и example.cl ?? тогда нужно добавить директивы компилятора OpenACC? или как иначе? если это так, то какой здесь смысл OpenACC, потому что мы пишем оба файла * .c и * .cl (нам нужно проверить все ограничения памяти и все для написания OpenCL, что является сложной работой).


person Fakruddeen    schedule 31.01.2013    source источник
comment
Следует учитывать 3 уровня: 1) OpenCL - это низкоуровневый параллелизм ускорителя, который можно писать самостоятельно, 2) библиотеки OpenCL просты в использовании, основаны на OpenCL, написаны вручную для достижения параллелизма ускорителей, 3) OpenACC полагается на на компиляторах, чтобы каким-то образом автоматически находить параллелизм ускорителей в вашем коде. На практике компиляторы не справляются с задачей автоматического определения параллелизма для большинства проблем. В прошлом году мы писали на эту тему: blog.accelereyes.com/blog/2012/04/11/   -  person arrayfire    schedule 01.02.2013
comment
Если вы еще не нашли его, вы можете изучить разделы "Образование" и образец кода OpenACC   -  person John Coombs    schedule 11.07.2013


Ответы (4)


На самом деле OpenACC очень похож на OpenMP, но нацелен на устройства ускорения, такие как графические процессоры. Вместо OpenMP #pragma parallel for, распараллеливающего цикл для многопоточного ЦП, OpenACC #pragma acc kernels превратит содержащиеся в нем циклы в функции ядра, которые выполняются на GPU. Многое из того, что теперь нужно делать вручную (например, перенос данных с устройства и на устройство), скрыто компилятором. Таким образом, у вас нет двух отдельных единиц компиляции.

Теперь вот проблема с OpenACC, и мой ответ на вопрос, почему принятие сейчас очень невелико: нет поддержки со стороны GCC или Clang. Конечно, есть коммерческие решения от PGI и CAPS, но без этих других компиляторов вы отпугнете многих пользователей.

person matthias    schedule 31.01.2013
comment
Большое спасибо за ваш ответ .. Мои сомнения прояснены ... Я хочу больше узнать об этом OpenACC ... Я изучил некоторые PDF-файлы и документы по этому поводу ... Я хочу изучить гораздо больше, вы можете предоставить мне любой источник, который лучше учиться? - person Fakruddeen; 31.01.2013
comment
К сожалению, дополнительной информации, кроме той, которую вы можете получить на официальном сайте, не так много. Это также может быть связано с низким уровнем принятия OpenACC. - person matthias; 31.01.2013
comment
GCC может получить прогресс в 4.9 - person Demi; 20.09.2013
comment
Mentor Graphics - это работает над этим - person errordeveloper; 20.12.2013

Обновление: gcc6 теперь работает частично:

«Серия выпусков GCC 6 включает значительно улучшенную реализацию спецификации OpenACC 2.0a».

См. https://gcc.gnu.org/wiki/OpenACC.

person Linas    schedule 11.01.2017

Обновление (август 2020 г.):

person David Bellot    schedule 09.08.2020

Обновление: GCC6 + 7 активно интегрирует спецификации OpenACC

См. https://gcc.gnu.org/wiki/OpenACC.

person Stack The User    schedule 23.08.2017