2015-03-10 11 views
12

Я искал в Интернете, но я все еще очень смущен этой темой. Может ли кто-нибудь объяснить это более четко? Я исхожу из опыта Aerospace Engineering (а не из Computer Science), поэтому, когда я читаю онлайн о OpenMP/CUDA/etc. и многопоточность Я не очень понимаю многое из того, что говорится.Может ли OpenMP использоваться для графических процессоров?

Я сейчас пытаюсь распараллелить внутреннее программное обеспечение CFD, написанное в FORTRAN. Это мои сомнения:

  1. OpenMP разделяет рабочую нагрузку с использованием нескольких потоков из CPU. Может ли он использоваться, чтобы позволить графическому процессору получить часть работы?

  2. Я читал о OpenACC. Он похож на OpenMP (простой в использовании)?

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

  1. Есть ли простой и переносимый способ поделиться моей рабочей нагрузкой с графическим процессором для FORTRAN (если OpenMP этого не делает, а OpenACC не переносится)?

Можете ли вы дать мне ответ типа «для чайников»? стандарт

+0

Я предлагаю взглянуть на OpenCL, поскольку это простой способ совместного использования одного и того же кода для исполнения на CPU и GPU. Ядро - это базовая единица исполняемого кода, такая как C-функция, которая может быть параллельной или параллельной работе. Также существуют привязки для Fortran для OpenCL. Взгляните на введение серии OpenCL от AMD: https://www.youtube.com/watch?v=ecYIsu83c0I&list=PL3B46A983A7382FA6 – sled

+3

Поиск по термину * OpenMP-ускорители *. * В OpenMP 4.0 были введены ускорители * (из которых такие графические процессоры). –

+0

[С предстоящим выпуском компилятора GCC 5 имеется поддержка инфраструктуры разгрузки, поскольку OpenMP 4.0 и выгрузка OpenACC для ускорителей начинают развиваться в этом компиляторе с открытым исходным кодом. Для тех, кто хочет поиграть с последним экспериментальным кодом, можно намочить ноги, если у вас есть графический процессор NVIDIA или поддерживаемая карта Intel Xeon Phi MIC.] (Http://www.phoronix.com/scan.php?page= news_item & px = GCC-5-Разгрузка-How-To) –

ответ

5
  1. OpenMP 4.0 включает в себя поддержку ускорителей (GPU, DSP, Xeon Phi, и так далее), но я не знаю ни одной реализации существования в OpenMP 4.0 стандарта для GPU, только early experience.

  2. OpenACC действительно похож на OpenMP и прост в использовании. Хороший учебник OpenACC: part 1 и part 2.

К сожалению, я думаю, что нет портативного решения для CPU и GPU, по крайней мере, на данный момент (за исключением OpenCL, но это слишком низкий уровень по сравнению с OpenMP и OpenACC).

Если вам требуется портативное решение, вы можете рассмотреть возможность использования ускорителя Intel Xeon Phi вместо графического процессора. Компилятор Intel Fortran (и C/C++) включает поддержку OpenMP как для CPU, так и для Xeon Phi.

Кроме того, для создания действительно портативного решения недостаточно использовать подходящую параллельную технологию. Вы должны изменить свою программу, чтобы обеспечить достаточный уровень параллелизма. См. «Structured Parallel Programming» или аналогичные книги для примеров возможных подходов.

+0

Что лучше? Чтобы запустить вычислительные тяжелые части программы на процессоре или графическом процессоре? Конечно, это зависит от конкретного оборудования, но в целом? –

+0

В целом, лучше использовать вычислительные интенсивные части на графическом процессоре (или другом ускорителе, таком как Xeon Phi или FPGA). Производительность современных ускорителей как минимум в 5 раз выше производительности ЦП. –

0

Предыдущий ответ охватывает большинство из них, но так как вы говорили о предоставлении ГПУ некоторых работ а, вы можете захотеть взглянуть на рамках для гетерогенных вычислений (CPU + GPU одновременно), таких как StarPU.

Поскольку StarPU предназначен только для C/C++, у вас есть ForOpenCL для Fortran.

В любом случае вам необходимо рассмотреть возможность компромиссного удобства.

+1

Вы заметили тег Fortran? –

+0

StarPU кажется классным, но если я правильно посмотрел, то только для C. –

+0

@VladimirF Nop, извините, обновлено. – a3mlord

2

Да. Целевые конструкции OpenMP 4 были разработаны для поддержки широкого спектра ускорителей.Поддержка компилятора для графических процессоров NVIDIA доступна в GCC 7+ (см. 1 и 2, хотя последняя не обновлена ​​с учетом поддержки OpenMP 4 GPU), Clang (см. 3, 4, 5) и Cray. Поддержка компилятора для графических процессоров Intel доступна в компиляторе Intel C/C++ (см., Например, 6).

Разработанная IBM реализация Clang/LLVM OpenMP 4+ для графических процессоров NVIDIA доступна с https://github.com/clang-ykt. Рецепт сборки представлен в "OpenMP compiler for CORAL/OpenPower Heterogeneous Systems".

Компилятор Cray поддерживает цель OpenMP для графических процессоров NVIDIA. От Cray Fortran Reference Manual (8.5):

Целевые директивы OpenMP 4.5 поддерживаются для таргетинга графических процессоров NVIDIA или текущего целевого процессора. Для использования целевых директив должен быть загружен соответствующий целевой модуль ускорителя .

Компилятор Intel поддерживает цель OpenMP для графики Intel Gen для C/C++, но не Fortran. Кроме того, положения и distribute не поддерживаются, поскольку они не являются необходимыми/соответствующими. Ниже приведен простой пример, показывающий, как целевые функции OpenMP работают в разных средах.

void vadd2(int n, float * a, float * b, float * c) 
{ 
    #pragma omp target map(to:n,a[0:n],b[0:n]) map(from:c[0:n]) 
#if defined(__INTEL_COMPILER) && defined(__INTEL_OFFLOAD) 
    #pragma omp parallel for simd 
#else 
    #pragma omp teams distribute parallel for simd 
#endif 
    for(int i = 0; i < n; i++) 
     c[i] = a[i] + b[i]; 
} 

Варианты компилятора для Intel и GCC заключаются в следующем. У меня нет настроек GCC для графических процессоров NVIDIA, но вы можете увидеть documentation для соответствующих -foffload вариантов.

$ icc -std=c99 -qopenmp -qopenmp-offload=gfx -c vadd2.c && echo "SUCCESS" || echo "FAIL" 
SUCCESS 
$ gcc-7 -fopenmp -c vadd2.c && echo "SUCCESS" || echo "FAIL" 
SUCCESS 
+0

Вопрос задается специально для Фортрана. –

+0

IBM разрабатывает два компилятора OpenMP. Один из них - Clang/LLVM. Другой - компилятор XL. Для Fortran компилятор XL Fortran поддерживает большое подмножество разгрузки OpenMP 4.5 на графические процессоры NVIDIA, начиная с версии [15.1.5] (https://www.ibm.com/support/knowledgecenter/SSAT4T_15.1.5/com.ibm. xlf1515.lelinux.doc/getstart/omp_v1315v1515.html). Дополнительные возможности добавляются в этом году и в следующем году с целью полной поддержки в 2018 году. Если вы находитесь в POWER, вы можете присоединиться к бета-программе, чтобы получить доступ к последним функциям. –

+0

@VladimirF В вопросе говорится, что CUDA рассматривался. CUDA является производным от C/C++, поэтому поддержка OpenMP 4 в Intel C/C++ не менее применима. Кроме того, функции совместимости C в Fortran 2003 означают, что разработка приложений Fortran не является взаимоисключающей для моделей ускорителей, основанных или ограниченных C/C++ (например, OpenCL). – Jeff

3

Чтобы добавить к тому, что было сказано о поддержке других платформ выше: IBM вносит свой вклад в два OpenMP 4.5 компиляторов: Одним из них является открытым исходным кодом Clang/LLVM один. Другой - компилятор IBM XL. Оба компилятора используют одну и ту же вспомогательную библиотеку разгрузки OpenMP, но различаются в генерации и оптимизации кода компилятора для графического процессора. Для Fortran компилятор XL Fortran поддерживает большой набор разгрузки OpenMP 4.5 на графические процессоры NVIDIA, начиная с версии 15.1.5. (И версия 13.1.5 для XL C/C++). Дополнительные функции добавляются в этом году и в следующем году с целью полной поддержки в 2018 году. Если вы находитесь в POWER, вы можете присоединиться к бета-программе компилятора XL, чтобы получить доступ к нашим последним функциям разгрузки OpenMP в Fortran и C/C++ ,