* Jacobi-1 program */ /* Jacobi-1 program *




Название* Jacobi-1 program */ /* Jacobi-1 program *
Дата конвертации09.05.2013
Размер445 b.
ТипПрезентации









/* Jacobi-1 program */

  • /* Jacobi-1 program */

  • #include

  • #include

  • #include

  • #define Max(a,b) ((a)>(b)?(a):(b))

  • #define L 2000

  • #define ITMAX 50

  • int i,j,it,k;

  • double eps;

  • double MAXEPS = 0.5;

  • double A[L][L], B[L][L];

  • int main(int an, char **as)

  • {

  • printf("JAC STARTED\n");

  • for(i=0; i<=L-1; i++)

  • for(j=0; j<=L-1; j++)

  • {

  • A[i][j]=0.;

  • B[i][j]=1.+i+j;

  • }



/* Sor program */

  • /* Sor program */

  • #include

  • #include

  • #include

  • #define Max(a,b) ((a)>(b)?(a):(b))

  • #define L 2000

  • #define ITMAX 50

  • int i,j,it,k;

  • double eps;

  • FILE *f;

  • double A[L][L];

  • double tmp;

  • int main(int an, char **as)

  • {

  • printf("SOR STARTED\n");

  • for(i=0; i<=L-1; i++)

  • for(j=0; j<=L-1; j++)

  • {

  • if(i==0 || j==0 || i==L-1 || j==L-1) A[i][j]=0.;

  • else A[i][j]=1.+i+j;

  • }



for(int i = 1; i < 100; i++)

  • for(int i = 1; i < 100; i++)

  • a[i]= a[i-1] + a[i+1]

  • Между витками цикла с индексами i1 и i2 ( i1 существует зависимость по данным (информационная связь) массива A, если оба эти витка осуществляют обращение к одному элементу массива по схеме запись-чтение или чтение-запись.

  • Если виток i1 записывает значение, а виток i2 читает это значение, то между этими витками существует потоковая зависимость или просто зависимость i1 ->  i2.

  • Если виток i1 читает “старое” значение, а виток i2 записывает “новое” значение, то между этими витками существует обратная зависимость i1<- i2.

  • В обоих случаях виток i2 может выполняться только после витка i1.



Цикл с зависимостью по данным может быть распараллелен с помощью конструкции ordered:

  • Цикл с зависимостью по данным может быть распараллелен с помощью конструкции ordered:

  • #pragma omp parallel for ordered

  • for(int i = 1; i < 100; i++) {

  • #pragma omp ordered

  • {

  • a[i]= a[i-1] + a[i+1]

  • }

  • }



for(int i = 1; i < N; i++)

  • for(int i = 1; i < N; i++)

  • for(int j = 1; j < N; j++)

  • a[i][j] = (a[i-1][j] + a[i][j-1] + a[i+1][j] + a[i][j+1]) / 4





#include

  • #include

  • int main () {

  • #pragma omp parallel private(iam,numt)

  • {

  • iam = omp_get_thread_num ();

  • numt = omp_get_num_threads ();

  • for (int newi=1; newi

  • int i = newi - iam;

  • #pragma omp for

  • for (int j=1; j

  • if (i >= 1) && (i< N)) {

  • a[i][j]=(a[i-1][j] + a[i][j-1] + a[i+1][j] + a[i][j+1])/4;

  • }

  • }

  • }

  • }

  • }





Клауза schedule:

  • Клауза schedule:

  • schedule(алгоритм планирования[, число_итераций])

  • Где алгоритм планирования один из:

  • schedule(static[, число_итераций]) - статическое планирование;

  • schedule(dynamic[, число_итераций]) - динамическое планирование;

  • schedule(guided[, число_итераций]) - управляемое планирование;

  • schedule(runtime) - планирование в период выполнения;

  • schedule(auto) - автоматическое планирование (OpenMP 3.0).

  • #pragma omp parallel for schedule(static)

  • for(int i = 1; i <= 100; i++)

  • A[i]=0.;



#pragma omp parallel for schedule(static, 10)

  • #pragma omp parallel for schedule(static, 10)

  • for(int i = 1; i <= 100; i++)

  • Результат выполнения программы на 4-х ядерном процессоре может быть следующим:

  • Поток 0 получает право на выполнение итераций 1-10, 41-50, 81-90.

  • Поток 1 получает право на выполнение итераций 11-20, 51-60, 91-100.

  • Поток 2 получает право на выполнение итераций 21-30, 61-70.

  • Поток 3 получает право на выполнение итераций 31-40, 71-80



#pragma omp parallel for schedule(dynamic, 15)

  • #pragma omp parallel for schedule(dynamic, 15)

  • for(int i = 1; i <= 100; i++)

  • Результат выполнения программы на 4-х ядерном процессоре может быть следующим:

  • Поток 0 получает право на выполнение итераций 1-15.

  • Поток 1 получает право на выполнение итераций 16-30.

  • Поток 2 получает право на выполнение итераций 31-45.

  • Поток 3 получает право на выполнение итераций 46-60.

  • Поток 3 завершает выполнение итераций.

  • Поток 3 получает право на выполнение итераций 61-75.

  • Поток 2 завершает выполнение итераций.

  • Поток 2 получает право на выполнение итераций 76-90.

  • Поток 0 завершает выполнение итераций.

  • Поток 0 получает право на выполнение итераций 91-100.



число_выполняемых_потоком_итераций = max(число_нераспределенных_итераций/omp_get_num_threads(), число_итераций)

  • число_выполняемых_потоком_итераций = max(число_нераспределенных_итераций/omp_get_num_threads(), число_итераций)

  • #pragma omp parallel for schedule(guided, 10)

  • for(int i = 1; i <= 100; i++)

  • Пусть программа запущена на 4-х ядерном процессоре.

  • Поток 0 получает право на выполнение итераций 1-25.

  • Поток 1 получает право на выполнение итераций 26-44.

  • Поток 2 получает право на выполнение итераций 45-59.

  • Поток 3 получает право на выполнение итераций 60-69.

  • Поток 3 завершает выполнение итераций.

  • Поток 3 получает право на выполнение итераций 70-79.

  • Поток 2 завершает выполнение итераций.

  • Поток 2 получает право на выполнение итераций 80-89.

  • Поток 3 завершает выполнение итераций.

  • Поток 3 получает право на выполнение итераций 90-99.

  • Поток 1 завершает выполнение итераций.

  • Поток 1 получает право на выполнение 100 итерации.



#pragma omp parallel for schedule(runtime)

  • #pragma omp parallel for schedule(runtime)

  • for(int i = 1; i <= 100; i++) /* способ распределения витков цикла между нитями будет задан во время выполнения программы*/

  • При помощи переменных среды:

  • csh:

  • setenv OMP_SCHEDULE "dynamic,4“

  • ksh:

  • export OMP_SCHEDULE="static,10“

  • Windows:

  • set OMP_SCHEDULE=auto

  • или при помощи функции системы поддержки:

  • void omp_set_schedule(omp_sched_t kind, int modifier);



#pragma omp parallel for schedule(auto)

  • #pragma omp parallel for schedule(auto)

  • for(int i = 1; i <= 100; i++)

  • Способ распределения витков цикла между нитями определяется реализацией компилятора.

  • На этапе компиляции программы или во время ее выполнения определяется оптимальный способ распределения.







Похожие:

* Jacobi-1 program */ /* Jacobi-1 program * iconProgram prim3; program prim3
В заданном числовом промежутке ([20;50]∩[150;200]) найти числа, кратные 6, и посчитать их количество
* Jacobi-1 program */ /* Jacobi-1 program * iconProgram a1; program a1; var P,A,B,C: integer

* Jacobi-1 program */ /* Jacobi-1 program * iconUndersök vilka program som visas på ryska tv-kanaler. Sök reda på ett program som du vill se från varje kanal

* Jacobi-1 program */ /* Jacobi-1 program * iconProgram n1

* Jacobi-1 program */ /* Jacobi-1 program * iconProgram

* Jacobi-1 program */ /* Jacobi-1 program * iconProgram graf; Program graf

* Jacobi-1 program */ /* Jacobi-1 program * iconHoliday Program 2005 Techniques of Teaching

* Jacobi-1 program */ /* Jacobi-1 program * iconC:\Program Files\Intel\Composerxe-2011 \Documentation\en us\mkl\mkl userguide\ index htm

* Jacobi-1 program */ /* Jacobi-1 program * iconScientific Visualization hpc school July 2009, Moscow Tiled Images
Строит изображения со спутников Defense Meteorological Satellite Program на поверхности Земли
* Jacobi-1 program */ /* Jacobi-1 program * iconProgram a3
Дана прямоугольная матрица, элементами которой являются целые числа. Поменять местами ее строки следующим образом: первую строку...
Разместите кнопку на своём сайте:
dok.opredelim.com


База данных защищена авторским правом ©dok.opredelim.com 2015
обратиться к администрации
dok.opredelim.com
Главная страница