Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Параллельная обработка данных лабраб.doc
Скачиваний:
41
Добавлен:
25.03.2016
Размер:
482.82 Кб
Скачать

Трансляция ОрепМр-программ

Трансляция ОрепМР-программы выполняется со специальным ключом. В операционной системе Linux транслятор Intel® Compiler использует ключ - openmp, например:

#ifort -о ту_prog prog_source.f9 0 -openmp

В операционной системе MSW тс1о\¥8командная строка выглядит следующим образом:

#ifort prog_source.f9 0 /Qopenmp

основано на его замене конечной суммой:

Приближенное вычисление определенного интеграла Приближенное вычисление интеграла:

где и’|. - числовые коэффициенты, а хк - точки отрезка [х0, xj. При­ближенное равенство: / ~ 1„ называется квадратурной формулой, точки хк - узлами квадратурной формулы, а числа wk - коэффициентами квадратурной формулы. Разные методы приближенного интегрирова­ния отличаются выбором узлов и коэффициентов. От этого выбора зависит погрешность квадратурной формулы:

Rn = V=In

Метод трапеций

Интегрирование методом трапеций основано на использовании кусочно-линейного приближения для интегрируемой функции. Пусть F(x) - гладкая функция на интервале \a,b\, и этот интервал делится на

п равных частей, каждая длиной h = b-an.

Приближение метода трапеций:

где f = F(a + jh) - значение интегрируемой функции в точке a+jh.

Метод Симпсона

Идея трехточечного метода Симпсона заключается в следующем. Пусть хт - это средняя точка интервала [х0. х, | и пусть О(х) - един­ственный полином второй степени, который интерполирует (прибли­жает) подынтегральную функцию F{x) по точкамх0, хГТ1 их,. Искомый интеграл аппроксимируется интегралом от функции Q(x):

Эта оценка точна, если F(x) является полиномом степени 3.

Обычно используются составные квадратурные формулы, когда промежуток интегрирования разбивается на N подынтервалов и про­стая формула Симпсона применяется на каждом из этих подынтервалов:

Недостатком рассмотренного метода является то, что он не дает возможности явно задать точность вычисления интеграла. Точность связана с количеством точек разбиения. От этого недостатка свободны методы интегрирования с адаптивным выбором шага разбиения. Если трехточечный метод Симпсона не дает достаточную точность на за-

данном интервале, он делится на 3 равные части, и метод вновь при­меняется к каждой из полученных частей.

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ № 6

  1. Выполнить распараллеливание последовательных программ, предназначенных для вычисления определенных интегралов: распа­раллеливание производится с помощью MPICH.

  2. Получить навык анализа простых программ и выявления в них потенциального параллелизма, применить для распараллеливания ОрепМРи MPI.

  3. Сравнить трудоемкость обоих подходов и эффективность по­лученного результата.

  4. На основании результатов, полученных при выполнении зада­ний данной лабораторной работы, написать отчет, в котором содер­жатся выводы об эффективности различных способов распараллели­вания исходного последовательного кода и трудоемкости реализации этих способов на практике.

Пример 1

В программе на языке Fortran 90 реализован метод трапеций. programintegraltrapez integer, parameter :: divno =100 real, parameter :: xO = 0., xl = 1. !3.14159 real, external :: F real:: result

result = trapezium(F, xO, xl, div no) print *, result

end

real function trapezium(F, xO, xl, divno)

real, external:: F real, intent(in) :: xO, xl integer, intent(in) :: div no real:: x, dx, sum integer :: j dx = (xl - xO) / div no sum = F(x0) + F(xl) x = xO do j = 1, div no - 1

х = х + dx sum = sum + 2.0 * F(x) end do

trapezium = dx * sum /2.0 end

real function F(x) real, intent(in) :: x !F= sinfx)

F = 4./(l.+x**2)

End

Пример 2

В программе на языке Fortran 90 реализован метод Симпсона. programintegral simps integer, parameter :: div no =100 real, parameter :: xO = 0., xl = 1. !3.14159 real, external:: F real:: result

result = simpson(F, xO, xl, div no) print *, result end

real function simpson(F, xO, xl, divno) real, external:: F real, intent(in) :: xO, xl integer, intent(in) :: div no

real:: x, dx, sum integer :: j

dx = (xl - xO) / (2.0 * div no) sum = F(x0) + F(xl) x = xO doj = 1, 2 * div no - 1 x = x + dx if (mod(j, 2) /= 0) then sum = sum + 4.0 * F(x) else

sum = sum + 2.0 * F(x) end if end do

simpson = dx * sum /3.0 end

7