Подтвердить что ты не робот

Можно ли использовать OpenMP для графических процессоров?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

  • Стандарт OpenMP 4.0 включает поддержку ускорителей (GPU, DSP, Xeon Phi и т.д.), но я не знаю никакой реализации стандарта OpenMP 4.0 для GPU, только ранний опыт.

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Компилятор Cray поддерживает цель OpenMP для графических процессоров NVIDIA. Из Справочное руководство Cray Fortran (8.5):

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

Компилятор Intel поддерживает цель OpenMP для графики Intel Gen для C/С++, но не Fortran. Кроме того, предложения teams и 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, но вы можете увидеть документацию для соответствующих опций -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

Ответ 4

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

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

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