OpenMP | Программа Hello World
Предварительное условие: OpenMP | Введение в руководство по установке
В C / C ++ / Fortran параллельное программирование может быть достигнуто с помощью OpenMP. В этой статье мы узнаем, как создать параллельную программу Hello World с помощью OpenMP.
ШАГИ ДЛЯ СОЗДАНИЯ ПАРАЛЛЕЛЬНОЙ ПРОГРАММЫ
- Включите файл заголовка : мы должны включить заголовок OpenMP для нашей программы вместе со стандартными файлами заголовков.
// Заголовок OpenMP #include <omp.h>
- Укажите параллельную область : в OpenMP нам нужно указать область, которую мы собираемся сделать параллельной, используя ключевое слово pragma omp parallel . Прагма omp parallel используется для разветвления дополнительных потоков для выполнения работы, заключенной в параллельном режиме. Исходный поток будет обозначен как главный поток с идентификатором 0. Код для создания параллельной области будет следующим:
#pragma omp parallel { // Код параллельного региона }
Итак, здесь мы включаем
#pragma omp parallel { printf ("Привет, мир ... из потока =% d n", omp_get_thread_num ()); }
- Установите количество потоков :
мы можем установить количество потоков для выполнения программы, используя внешнюю переменную.экспорт OMP_NUM_THREADS = 5
Схема параллельной области
Согласно приведенному выше рисунку, как только компилятор обнаруживает код параллельных областей, главный поток ( поток с идентификатором потока 0 ) разветвляется на указанное количество потоков. Здесь он будет разделен на 5 потоков, потому что мы инициализируем количество выполняемых потоков равным 5, используя команду
export OMP_NUM_THREADS=5
. Весь код в параллельной области будет выполняться всеми потоками одновременно. Как только параллельная область закончится, все потоки будут объединены в главный поток. - Скомпилировать и запустить :
Скомпилировать:gcc -o привет -fopenmp hello.c
Выполнять:
./Привет
Ниже приведена полная программа с результатами описанного выше подхода:
Программа: Поскольку мы указали количество выполняемых потоков равным 5, 5 потоков будут выполнять один и тот же оператор печати в один и тот же момент времени. Здесь мы не можем гарантировать порядок выполнения потоков, т.е. порядок выполнения операторов в параллельной области не будет одинаковым для всех исполнений . На рисунке ниже, при выполнении программы для первого потока 1 завершается первым, тогда как во втором запуске поток 0 завершается первым. omp_get_thread_num()
вернет номер потока, связанный с потоком.
Программа OpenMP Hello World
// OpenMP program to print Hello World // using C language // OpenMP header #include <omp.h> #include <stdio.h> #include <stdlib.h> int main( int argc, char * argv[]) { // Beginning of parallel region #pragma omp parallel { printf ( "Hello World... from thread = %d
" , omp_get_thread_num()); } // Ending of parallel region } |
Выход:
- При первом запуске:
- При многократном запуске: порядок выполнения потоков меняется каждый раз.