
38513-LW_Integral_ppt
.pdf
Параллельная версия.
Распараллеливание базового алгоритма
Проанализируйте полученный код с помощью Intel Parallel Inspector.
–Результат анализа должен показать, что в полученной версии кода гонок данных нет.
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
31 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Результаты последовательной и параллельной версии не совпали. Всегда ли это говорит об ошибке?
Результаты последовательной и параллельной версии совпали. Всегда ли это говорит об отсутствии ошибок?
Инструмент показывает наличие ошибок. Всегда ли это правда?
Инструмент показывает отсутствие ошибок. Всегда ли это правда?
Алгоритмически порядок вычислений в посл. и паралл. версии одинаков. Всегда ли это будет так в машинной реализации?
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
32 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Сравнение времени численного интегрирования для последовательной и параллельной реализации
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
33 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Сетку интегрирования можно разделять не только по столбцам, но и по строкам.
–Схематичное изображение метода распараллеливания по строкам представлено на слайде.
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
34 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Создайте в рамках решения 02_Integral новый проект с названием 02_Integral_row.
Выполните переход к использованию компилятора Intel C++ и в свойствах проекта включите поддержку использования OpenMP.
В рамках созданного проекта реализуйте параллельный алгоритм численного интегрирования с разделением сетки по строкам.
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
35 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Параллельная реализация численного интегрирования определенного интеграла с разделением сетки интегрирования по строкам:
//Сетка интегрирования делится по строкам for(i = 0; i < n1; i++)
{
//разделение точек сетки интегрирования по оси y
#pragma omp parallel for private (x, y) reduction(+: sum) for(j = 0; j < n2; j++)
{
//вычисление координат точки y = a2 + j*h + h / 2;
x = a1 + i*h + h / 2;
//вычисление интеграла
sum += ((exp(sin(x * PI) * cos(y * PI)) + 1) / ((b1 - a1) * (b2 - a2))) * h * h;
}
}
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
36 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Пересоберите получившийся код (команда Build→Rebuild Solution) и запустите его на выполнение.
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
37 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Сравнение времени численного интегрирования для последовательной и параллельных реализаций
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
38 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Еще один популярный способ геометрического разделения данных – разделения данных на блоки.
–Схематичное изображение параллельного алгоритма численного интегрирования с блочным разделением данных представлено на слайде
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
39 |
|
|

Параллельная версия.
Распараллеливание базового алгоритма
Создайте в рамках решения 02_Integral новый проект с названием 02_Integral_block.
Выполните переход к использованию компилятора Intel C++ и в свойствах проекта включим поддержку использования OpenMP.
Блочная схема легко реализуется с помощью использования вложенного параллелизма в OpenMP.
–Чтобы использовать вложенный параллелизм, необходимо сначала включить его поддержку с помощью вызова библиотечной функции:
//включаем возможность использования вложенного
//параллелизма
omp_set_nested(true);
Н. Новгород, 2010 г. |
Вычисление определенного интеграла |
40 |
|
|