OpenMP (по Бахтину) (Лекции), страница 4
Описание файла
Файл "OpenMP (по Бахтину)" внутри архива находится в папке "Лекции". PDF-файл из архива "Лекции", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 4 страницы из PDF
Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ28 октябряМосква, 2011Технология параллельного программирования OpenMP84 из 142Система поддержки выполнения OpenMP-программВнутренние переменные, управляющие выполнениемOpenMP-программы (ICV-Internal Control Variables).Задание/опрос значений ICV-переменных.Функции работы со временем.28 октябряМосква, 2011Технология параллельного программирования OpenMP85 из 142Internal Control VariablesДля параллельных областей: nthreads-var thread-limit-var dyn-var nest-var max-active-levels-varДля циклов: run-sched-var def-sched-varДля всей программы: stacksize-var wait-policy-var28 октябряМосква, 2011Технология параллельного программирования OpenMP86 из 142Internal Control Variables. nthreads-varОпределяет максимально возможное количество нитей в создаваемойпараллельной области.Начальное значение: зависит от реализации.Существует одна копия этой переменной для каждой задачи.Значение переменной можно изменить:C shell:setenv OMP_NUM_THREADS 4,3,2Korn shell:export OMP_NUM_THREADS=16Windows:set OMP_NUM_THREADS=16void omp_set_num_threads(int num_threads);Узнать значение переменной можно:int omp_get_max_threads(void);28 октябряМосква, 2011Технология параллельного программирования OpenMP87 из 142Internal Control Variables.
thread-limit-varОпределяет максимальное количество нитей, которые могут бытьиспользованы для выполнения всей программы.Начальное значение: зависит от реализации.Существует одна копия этой переменной для всей программы.Значение переменной можно изменить:C shell:setenv OMP_THREAD_LIMIT 16Korn shell:export OMP_THREAD_LIMIT=16Windows:set OMP_THREAD_LIMIT=16Узнать значение переменной можно:int omp_get_thread_limit(void)28 октябряМосква, 2011Технология параллельного программирования OpenMP88 из 142Internal Control Variables. dyn-varВключает/отключает режим, в котором количество создаваемых нитей привходе в параллельную область может меняться динамически.Начальное значение: Если компилятор не поддерживает данный режим,то false.Существует одна копия этой переменной для каждой задачи.Значение переменной можно изменить:C shell:setenv OMP_DYNAMIC trueKorn shell:export OMP_DYNAMIC=trueWindows:set OMP_DYNAMIC=truevoid omp_set_dynamic(int dynamic_threads);Узнать значение переменной можно:int omp_get_dynamic(void);28 октябряМосква, 2011Технология параллельного программирования OpenMP89 из 142Internal Control Variables.
nest-varВключает/отключает режим поддержки вложенного параллелизма.Начальное значение: false.Существует одна копия этой переменной для каждой задачи.Значение переменной можно изменить:C shell:setenv OMP_NESTED trueKorn shell:export OMP_NESTED=falseWindows:set OMP_NESTED=truevoid omp_set_nested(int nested);Узнать значение переменной можно:int omp_get_nested(void);28 октябряМосква, 2011Технология параллельного программирования OpenMP90 из 142Internal Control Variables.
max-active-levels-varЗадает максимально возможное количество активных вложенных параллельныхобластей.Начальное значение: зависит от реализации.Существует одна копия этой переменной для всей программы.Значение переменной можно изменить:C shell:setenv OMP_MAX_ACTIVE_LEVELS 2Korn shell:export OMP_MAX_ACTIVE_LEVELS=3Windows:set OMP_MAX_ACTIVE_LEVELS=4void omp_set_max_active_levels (int max_levels);Узнать значение переменной можно:int omp_get_max_active_levels(void);28 октябряМосква, 2011Технология параллельного программирования OpenMP91 из 142Internal Control Variables. run-sched-varЗадает способ распределения витков цикла между нитями, если указанаклауза schedule(runtime).Начальное значение: зависит от реализации.Существует одна копия этой переменной для каждой задачи.Значение переменной можно изменить:C shell:setenv OMP_SCHEDULE "guided,4"Korn shell:export OMP_SCHEDULE "dynamic,5"Windows:typedef enum omp_sched_t {omp_sched_static = 1,omp_sched_dynamic = 2,omp_sched_guided = 3,omp_sched_auto = 4} omp_sched_t;set OMP_SCHEDULE=staticvoid omp_set_schedule(omp_sched_t kind, int modifier);Узнать значение переменной можно:void omp_get_schedule(omp_sched_t * kind, int * modifier );28 октябряМосква, 2011Технология параллельного программирования OpenMP92 из 142Internal Control Variables.
run-sched-varvoid work(int i);int main () {omp_sched_t schedules [] = {omp_sched_static, omp_sched_dynamic,omp_sched_guided, omp_sched_auto};omp_set_num_threads (4);#pragma omp parallel{omp_set_schedule (schedules[omp_get_thread_num()],0);#pragma omp parallel for schedule(runtime)for (int i=0;i<N;i++) work (i);}}28 октябряМосква, 2011Технология параллельного программирования OpenMP93 из 142Internal Control Variables. def-sched-varЗадает способ распределения витков цикла между нитями по умолчанию.Начальное значение: зависит от реализации.Существует одна копия этой переменной для всей программы.void work(int i);int main () {#pragma omp parallel{#pragma omp forfor (int i=0;i<N;i++) work (i);}}28 октябряМосква, 2011Технология параллельного программирования OpenMP94 из 142Internal Control Variables.
stack-size-varКаждая нить представляет собой независимо выполняющийся потокуправления со своим счетчиком команд, регистровым контекстом истеком.Переменная stack-size-var задает размер стека.Начальное значение: зависит от реализации.Существует одна копия этой переменной для всей программы.Значение переменной можно изменить:setenv OMP_STACKSIZE 2000500Bsetenv OMP_STACKSIZE "3000 k"setenv OMP_STACKSIZE 10Msetenv OMP_STACKSIZE "10 M"setenv OMP_STACKSIZE "20 m"setenv OMP_STACKSIZE "1G"setenv OMP_STACKSIZE 2000028 октябряМосква, 2011Технология параллельного программирования OpenMP95 из 142Internal Control Variables.
stack-size-varint main () {int a[1024][1024];#pragma omp parallel private (a){for (int i=0;i<1024;i++)for (int j=0;j<1024;j++)a[i][j]=i+j;}icl /Qopenmp test.cppProgram Exception – stack overflowLinux: ulimit -aulimit -s <stacksize in Кbytes>Windows: /F<stacksize in bytes>-Wl,--stack, <stacksize in bytes>setenv KMP_STACKSIZE 10msetenv GOMP_STACKSIZE 10000}setenv OMP_STACKSIZE 10M28 октябряМосква, 2011Технология параллельного программирования OpenMP96 из 142Internal Control Variables.
wait-policy-varПодсказка OpenMP-компилятору о желаемом поведении нитей во время ожидания.Начальное значение: зависит от реализации.Существует одна копия этой переменной для всей программы.Значение переменной можно изменить:setenv OMP_WAIT_POLICY ACTIVEIBM AIXsetenv OMP_WAIT_POLICY activeSPINLOOPTIME=100000setenv OMP_WAIT_POLICY PASSIVEYIELDLOOPTIME=40000setenv OMP_WAIT_POLICY passive28 октябряМосква, 2011Технология параллельного программирования OpenMP97 из 142Internal Control Variables. Приоритетыклаузавызов функциипеременная окруженияICVomp_set_dynamic()OMP_DYNAMICdyn-varomp_set_nested()OMP_NESTEDnest-varnum_threadsomp_set_num_threads()OMP_NUM_THREADSnthreads-varscheduleomp_set_schedule()OMP_SCHEDULErun-sched-varscheduledef-sched-varomp_set_max_active_levels()28 октябряМосква, 2011OMP_STACKSIZEstacksize-varOMP_WAIT_POLICYwait-policy-varOMP_THREAD_LIMITthread-limit-varOMP_MAX_ACTIVE_LEVELSmax-active-levels-varТехнология параллельного программирования OpenMP98 из 142Система поддержки выполнения OpenMP-программint omp_get_num_threads(void);-возвращает количество нитей в текущей параллельной области#include <omp.h>void work(int i);void test(){int np;np = omp_get_num_threads(); /* np == 1*/#pragma omp parallel private (np){np = omp_get_num_threads();#pragma omp for schedule(static)for (int i=0; i < np; i++)work(i);}}28 октябряМосква, 2011Технология параллельного программирования OpenMP99 из 142Система поддержки выполнения OpenMP-программint omp_get_thread_num(void);-возвращает номер нити в группе [0: omp_get_num_threads()-1]#include <omp.h>void work(int i);void test(){int iam;iam = omp_get_thread_num(); /* iam == 0*/#pragma omp parallel private (iam){iam = omp_get_thread_num();work(iam);}}28 октябряМосква, 2011Технология параллельного программирования OpenMP100 из 142Система поддержки выполнения OpenMP-программint omp_get_num_procs(void);-возвращает количество процессоров, на которых программа выполняется#include <omp.h>void work(int i);void test(){int nproc;nproc = omp_get_num_ procs();#pragma omp parallel num_threads(nproc){int iam = omp_get_thread_num();work(iam);}}28 октябряМосква, 2011Технология параллельного программирования OpenMP101 из 142Система поддержки выполнения OpenMP-программint omp_get_level(void)- возвращает уровень вложенности для текущей параллельной области.#include <omp.h>void work(int i) {#pragma omp parallel{int ilevel = omp_get_level ();}}void test(){int ilevel = omp_get_level (); /*ilevel==0*/#pragma omp parallel private (ilevel){ilevel = omp_get_level ();int iam = omp_get_thread_num();work(iam);}}28 октябряМосква, 2011Технология параллельного программирования OpenMP102 из 142Система поддержки выполнения OpenMP-программint omp_get_active_level(void)- возвращает количество активных параллельных областей(выполняемых 2-мя или более нитями).#include <omp.h>void work(int iam, int size) {#pragma omp parallel{int ilevel = omp_get_active_level ();}}void test(){int size = 0;int ilevel = omp_get_active_level (); /*ilevel==0*/scanf("%d",&size);#pragma omp parallel if (size>10){int iam = omp_get_thread_num();work(iam, size);}}28 октябряМосква, 2011Технология параллельного программирования OpenMP103 из 142Система поддержки выполнения OpenMP-программint omp_get_ancestor_thread_num (int level)- для нити, вызвавшей данную функцию, возвращается номер нитиродителя, которая создала указанную параллельную область.omp_get_ancestor_thread_num (0) = 0If (level==omp_get_level()) {omp_get_ancestor_thread_num (level) == omp_get_thread_num ();}If ((level<0)||(level>omp_get_level())) {omp_get_ancestor_thread_num (level) == -1;}28 октябряМосква, 2011Технология параллельного программирования OpenMP104 из 142Система поддержки выполнения OpenMP-программint omp_get_team_size(int level);- количество нитей в указанной параллельной области.omp_get_team_size (0) = 1If (level==omp_get_level()) {omp_get_team_size (level) == omp_get_num _threads ();}If ((level<0)||(level>omp_get_level())) {omp_get_team_size (level) == -1;}28 октябряМосква, 2011Технология параллельного программирования OpenMP105 из 142Система поддержки выполнения OpenMP-программ.Функции работы со временемdouble omp_get_wtime(void);возвращает для нити астрономическое время в секундах, прошедшее снекоторого момента в прошлом.