Скачать презентацию Примеры использования Open MP ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННОГО ИНТЕГРАЛА Скачать презентацию Примеры использования Open MP ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННОГО ИНТЕГРАЛА

ПП лекция 4 .pptx

  • Количество слайдов: 30

Примеры использования Open. MP Примеры использования Open. MP

ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННОГО ИНТЕГРАЛА 2 ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННОГО ИНТЕГРАЛА 2

Метод прямоугольников 3 Метод прямоугольников 3

Последовательность выполнения • Последовательная версия. – Базовая реализация алгоритма интегрирования – Эффект применения компилятора Последовательность выполнения • Последовательная версия. – Базовая реализация алгоритма интегрирования – Эффект применения компилятора – Использование предварительных вычислений сложных функций – Алгоритмическая оптимизация • Параллельная версия. – Варианты распараллеливание базового алгоритма – Распараллеливание оптимизированного алгоритма 4

Базовый алгоритм • Должен содержать код, несколько раз запускающий тестируемую реализацию алгоритма вычислений. • Базовый алгоритм • Должен содержать код, несколько раз запускающий тестируемую реализацию алгоритма вычислений. • Должен вычислять минимальное, максимальное и среднее времена ее работы. • Должен представлять результаты вычислений. • Параметры вычислений задаются в программе. • Провести анализ использования разных режимов компиляции. 5

Распараллеливание базового алгоритма • Геометрическая декомпозиция данных (разделение данных на части и применение к Распараллеливание базового алгоритма • Геометрическая декомпозиция данных (разделение данных на части и применение к ним одного и того же алгоритма). • Локализация данных. • Анализ результатов (гонка данных). 6

Геометрическая декомпозиция данных 1. По столбцам 2. По строкам 3. Блочно 1 2 3 Геометрическая декомпозиция данных 1. По столбцам 2. По строкам 3. Блочно 1 2 3 7

Оптимизация базового алгоритма • Предварительное вычисление сложных математических функций (sin, cos, exp и др. Оптимизация базового алгоритма • Предварительное вычисление сложных математических функций (sin, cos, exp и др. ). • Алгоритмическая оптимизация (исключение многократного вычисления одних и тех же данных, предварительные расчеты). • Буферизация. 8

Распараллеливание оптимизированного алгоритма Распараллеливание с учетом уже полученных результатов: • В данной задаче наилучшие Распараллеливание оптимизированного алгоритма Распараллеливание с учетом уже полученных результатов: • В данной задаче наилучшие результаты дает распараллеливание с разделением сетки интегрирования по столбцам (внешний цикл). • Распараллелить основные вычислительные циклы. 9

Пример выполнения вычислений 1 Пример выполнения вычислений 1

Структура программы main() experiment() integral() 11 Структура программы main() experiment() integral() 11

Пример выполнения вычислений Базовый алгоритм 1 Пример выполнения вычислений Базовый алгоритм 1

Основная программа int main () { int i; double time, res, min_time, max_time, avg_time; Основная программа int main () { int i; double time, res, min_time, max_time, avg_time; int numb. Exp = 10; min_time = max_time = avg_time = experiment(&res); for(i = 0; i < numb. Exp - 1; i ++) { time = experiment(&res); avg_time += time; if(max_time < time) max_time = time; if(min_time > time) min_time = time; } printf(“Интеграл равен: %lf; n", res); printf( «Время выполнения: %lf; %lf n", avg_time / numb. Exp, min_time, max_time); return 0; } 13

Функция experiment double experiment(double *res) { double stime, ftime; double a 1 = 0. Функция experiment double experiment(double *res) { double stime, ftime; double a 1 = 0. 0 ; double a 1 = a 2 = 0. 0 ; double b 1 = 16. 0; double b 2 = 16. 0; double h = 0. 001; stime = omp_get_wtime( ); integral(a 1, b 1, a 2, b 2, h, res); ftime = omp_get_wtime( ); return (ftime - stime); } 14

Функция integral void integral(const double a 1, const double b 1, const double a Функция integral void integral(const double a 1, const double b 1, const double a 2, const double b 2, const double h, double *res){ int i, j, n 1, n 2; double sum, x, y; n 1 = (int)((b 1 - a 1) / h); n 2 = (int)((b 2 - a 2) / h); sum = 0. 0; for( i = 0; i < n 1; i++) { for(j = 0; j < n 2; j++) { x = a 1 + i * h + h / 2; y = a 2 + j * h + h / 2; sum += ((exp(sin(x * PI) * cos(y * PI)) + 1) / ((b 1 - a 1) * (b 2 - a 2))) * h; } } *res = sum; 15 }

Пример выполнения вычислений Базовый алгоритм - распараллеливание 1 Пример выполнения вычислений Базовый алгоритм - распараллеливание 1

Распараллеливание по столбцам #pragma omp parallel for(i = 0; i < n 1; i++) Распараллеливание по столбцам #pragma omp parallel for(i = 0; i < n 1; i++) { for(j = 0; j < n 2; j++) { x = a 1 + i * h + h / 2; y = a 2 + j * h + h / 2; sum += ((exp(sin(x * PI) * cos(y * PI)) + 1) / ((b 1 - a 1) * (b 2 - a 2))) * h; } } 17

Распараллеливание по столбцам с учетом data race #pragma omp parallel for private (x, y, Распараллеливание по столбцам с учетом data race #pragma omp parallel for private (x, y, j) reduction(+: sum) for(i = 0; i < n 1; i++) { for(j = 0; j < n 2; j++) { x = a 1 + i * h + h / 2; y = a 2 + j * h + h / 2; sum += ((exp(sin(x * PI) * cos(y * PI)) + 1) / ((b 1 - a 1) * (b 2 - a 2))) * h; } } 18

Распараллеливание по строкам for(i = 0; i < n 1; i++) { #pragma omp Распараллеливание по строкам for(i = 0; i < n 1; i++) { #pragma omp parallel for private (x, y) reduction(+: sum) for(j = 0; j < n 2; j++) { x = a 1 + i * h + h / 2; y = a 2 + j * h + h / 2; sum += ((exp(sin(x * PI) * cos(y * PI)) + 1) / ((b 1 - a 1) * (b 2 - a 2))) * h; } } 19

Блочное разделение данных omp_set_nested(true); #pragma omp parallel for (i = 0; i < n Блочное разделение данных omp_set_nested(true); #pragma omp parallel for (i = 0; i < n 1; i++) { #pragma omp parallel for private (x, y) reduction(+: sum) for(j = 0; j < n 2; j++) { x = a 1 + i * h + h / 2; y = a 2 + j * h + h / 2; sum += ((exp(sin(x * PI) * cos(y * PI)) + 1) / ((b 1 - a 1) * (b 2 - a 2))) * h; } } 20

П ы й о ам ок бл ам лб ц ст о П о П ы й о ам ок бл ам лб ц ст о П о 4. 962583 П м ка ст ро х 5 о ы нн да 7. 986363 П ка se ) ea el (R ) eb ug (D 10 Го н ет т ра сч е ра сч й ны ьн ат ел ос ле до в те ль ов а ос ле д П Результаты вычислений 35 33. 076307 30 25 20 15 2. 586295 1. 7050952. 718545 0 21

Влияние параметров распараллеливания циклов 2 1. 95 1. 9 1. 85 1. 8 1. Влияние параметров распараллеливания циклов 2 1. 95 1. 9 1. 85 1. 8 1. 75 1. 7 1. 65 1. 6 1. 55 1. 5 0 1 static 2 dynamic 4 guided 8 16 22

Пример выполнения вычислений Оптимизированный алгоритм – распараллеливание 23 Пример выполнения вычислений Оптимизированный алгоритм – распараллеливание 23

Использование предварительных вычислений сложных функций void integral(const double a 1, const double b 1, Использование предварительных вычислений сложных функций void integral(const double a 1, const double b 1, const double a 2, const double b 2, const double h, double *res) { int i, j, n 1, n 2; double sum, x, y, *sinx, *cosy; n 1 = (int)((b 1 - a 1) / h); n 2 = (int)((b 2 - a 2) / h); sum = 0. 0; sinx = new double [n 1]; cosy = new double [n 2]; for(i = 0; i < n 1; i++) { x = a 1 + i * h + h / 2; sinx[i] = sin(x * PI); } for(j = 0; j < n 2; j++) { y = a 2 + j * h + h / 2; cosy[j] = cos(y * PI); } for(i = 0; i < n 1; i++) { for(j = 0; j < n 2; j++) {sum += ((exp(sinx[i] * cosy[j]) + 1) / ((b 1 - a 1) * (b 2 - a 2))) * h; } } *res = sum; 24 delete [] sinx; delete [] cosy; }

Результаты вычислений й ы ьн О пт ед ос л. п те ов а Результаты вычислений й ы ьн О пт ед ос л. п те ов а о П ар ал ле л ль ны й ок ам бл ам бц ол ст о П о ст ро П О пт П ос л. (R el ea ка se ) м 9 7. 986363 8 7 6 4. 585005 5 4 2. 718545 2. 586295 3 1. 705095 2 1 0. 051247 0 25

Загрузка ядер процессора Последовательный алгоритм Параллельный алгоритм Оптимизированный параллельный алгоритм 26 Загрузка ядер процессора Последовательный алгоритм Параллельный алгоритм Оптимизированный параллельный алгоритм 26

Пример выполнения вычислений Вычисление интеграла методом Монте-Карло 27 Пример выполнения вычислений Вычисление интеграла методом Монте-Карло 27

Метод Монте-Карло 28 Метод Монте-Карло 28

Функция integral void integral(const double a 1, const double b 1, const double a Функция integral void integral(const double a 1, const double b 1, const double a 2, const double b 2, const double h, double *res) { int n=0; double sum, x, y, f; for(long int i=1; i<= n. Max; i++) { x=abs((double)(rand()%((int)(b 1 - a 1)*Mrand))) /Mrand; y=abs((double)(rand()% ((int)(b 2 - a 2)*Mrand)))/Mrand; f=abs((double)(rand()% ((int)(Fmax*Mrand))))/Mrand; if(func(x+a 1, y+a 2, a 1, b 1, a 2, b 2) <= f) n++; } sum=(b 1 - a 1)*(b 2 - a 2)*(Fmax)*n/n. Max; *res = sum; } 29

Вычисление значений функции #define n. Max 1000000 #define Mrand 10000 #define Fmax 0. 015 Вычисление значений функции #define n. Max 1000000 #define Mrand 10000 #define Fmax 0. 015 double func(double x, double y, const double a 1, const double b 1, const double a 2, const double b 2) { return (exp(sin(x * PI) * cos(y * PI)) + 1)/ ((b 1 - a 1) * (b 2 - a 2)); } 30