Скачать презентацию Основы Fortran Часть 2 Фирсин Антон Александрович Скачать презентацию Основы Fortran Часть 2 Фирсин Антон Александрович

Основы Fortran 2.pptx

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

Основы Fortran Часть 2 Фирсин Антон Александрович Основы Fortran Часть 2 Фирсин Антон Александрович

Почему фортран? Множество свободно доступных математических алгоритмов Высокая производительность, достижимая средствами языка Реализация параллельных Почему фортран? Множество свободно доступных математических алгоритмов Высокая производительность, достижимая средствами языка Реализация параллельных алгоритмов средствами компилятора Кроссплатформенность

Технологии повышения производительности SSE векторизация OMP параллелизация MPI Технологии повышения производительности SSE векторизация OMP параллелизация MPI

SSE 1: 8 128 -битных регистра MMX, 70 команд. Pentium 3 SSE 2: SSE SSE 1: 8 128 -битных регистра MMX, 70 команд. Pentium 3 SSE 2: SSE 1 + 144 новые команды. AMD k 8, Pentium 4 SSE 3: SSE 2 + 13 инструкций + новые возможности работы с регистрами. SSSE 3. Intel Core 2 SSE 4. Intel Penryn (Wolfdale, Yorkfield), Intel Nehalem, AMD (Bulldozer)

Поддержка SSE компиляторами Компилятор Intel: 1. /arch: <code> on Windows* ( -m<code> on Linux* Поддержка SSE компиляторами Компилятор Intel: 1. /arch: on Windows* ( -m on Linux* or Mac OS* X) AVX, SSE 4. 2, SSE 4. 1, SSSE 3, SSE 2, IA 32

Поддержка SSE компиляторами Компилятор Intel: 2. /Qx<code> on Windows*( -x<code> on Linux* or OS Поддержка SSE компиляторами Компилятор Intel: 2. /Qx on Windows*( -x on Linux* or OS X*) CORE-AVX 2, CORE-AVX-I, AVX, SSE 4. 2, ATOM_SSE 4. 2, SSE 4. 1, SSSE 3, ATOM_SSSE 3, SSE 2

Поддержка SSE компиляторами Компилятор Intel: 3. /Qax<code> on Windows* ( -ax<code> on Linux* or Поддержка SSE компиляторами Компилятор Intel: 3. /Qax on Windows* ( -ax on Linux* or OS X*) CORE-AVX 2, CORE-AVX-I, AVX, SSE 4. 2, SSE 4. 1, SSSE 3, SSE 2

Поддержка SSE компиляторами Компилятор gfortran: -ftree-vectorize -O 3 -maltivec (POWERPC) -msse/-msse 2 Поддержка SSE компиляторами Компилятор gfortran: -ftree-vectorize -O 3 -maltivec (POWERPC) -msse/-msse 2

Требования к циклам Границы должны быть вычисляемы на этапе времени исполнения Одна точка входа Требования к циклам Границы должны быть вычисляемы на этапе времени исполнения Одна точка входа и одна точка выхода Один код для всех итераций Порядок циклов не нарушен в ходе другой оптимизации Не вызываются не «чистые» функции

Пример SSE subroutine quad(len, a, b, c, x 1, x 2) real(4) a(len), b(len), Пример SSE subroutine quad(len, a, b, c, x 1, x 2) real(4) a(len), b(len), c(len), x 1(len), x 2(len), s do i=1, len s = b(i)**2 - 4. *a(i)*c(i) if (s. ge. 0. ) then x 1(i) = sqrt(s) x 2(i) = (-x 1(i) - b(i)) *0. 5 / a(i) x 1(i) = ( x 1(i) - b(i)) *0. 5 / a(i) else x 2(i)=0. x 1(i)=0. endif enddo end

Пример SSE > ifort -c -vec-report 2 quad. f 90(4): (col. 3) remark: LOOP Пример SSE > ifort -c -vec-report 2 quad. f 90(4): (col. 3) remark: LOOP WAS VECTORIZED.

Пример SSE subroutine no_vec(a, b, c) real(4), dimension(*) : : a, b, c integer Пример SSE subroutine no_vec(a, b, c) real(4), dimension(*) : : a, b, c integer : : i do i=1, 100 a(i) = b(i) * c(i) if (a(i) < 0. 0 ) exit enddo end

Пример SSE > ifort -c -vec-report 2 two_exits. f 90(5): (col. 3) remark: loop Пример SSE > ifort -c -vec-report 2 two_exits. f 90(5): (col. 3) remark: loop was not vectorized: nonstandard loop is not a vectorization candidate.

Пример SSE subroutine add(A, N, X) integer N, X real A(N) DO I=X+1, N Пример SSE subroutine add(A, N, X) integer N, X real A(N) DO I=X+1, N A(I) = A(I) + A(I-X) ENDDO end

Пример SSE > ifort example 1. f -nologo -Qvec-report 2 example 1. f(6): (col. Пример SSE > ifort example 1. f -nologo -Qvec-report 2 example 1. f(6): (col. 9) remark: loop was not vectorized: existence of vector dependence.

Пример SSE subroutine add(A, N, X) integer N, X real A(N) !DIR$ SIMD DO Пример SSE subroutine add(A, N, X) integer N, X real A(N) !DIR$ SIMD DO I=X+1, N A(I) = A(I) + A(I-X) ENDDO end

Пример SSE > ifort example 1. f -nologo -Qvec-report 2 example 1. f(7): (col. Пример SSE > ifort example 1. f -nologo -Qvec-report 2 example 1. f(7): (col. 9) remark: LOOP WAS VECTORIZED.

Пример SSE float a[4] = { 300. 0, 4. 0, 12. 0 }; float Пример SSE float a[4] = { 300. 0, 4. 0, 12. 0 }; float b[4] = { 1. 5, 2. 5, 3. 5, 4. 5 }; __asm { movups xmm 0, a ; // поместить 4 переменные с плавающей точкой из a в регистр xmm 0 movups xmm 1, b ; // поместить 4 переменные с плавающей точкой из b в регистр xmm 1 mulps xmm 0, xmm 1 ; // перемножить пакеты плавающих точек: xmm 0 = xmm 0 * xmm 1 ; // xmm 00 = xmm 10 * xmm 00 ; // xmm 01 = xmm 11 * xmm 01 ; // xmm 02 = xmm 12 * xmm 02 ; // xmm 03 = xmm 13 * xmm 03 movups a, xmm 0 ; // выгрузить результаты из регистра xmm 0 по адресам a };

OMP Разработку спецификации Open. MP ведут несколько крупных производителей вычислительной техники и программного обеспечения, OMP Разработку спецификации Open. MP ведут несколько крупных производителей вычислительной техники и программного обеспечения, чья работа регулируется некоммерческой организацией, называемой Open. MP Architecture Review Board (ARB). Первая версия появилась в 1997 году, предназначалась для языка Fortran. Для С/С++ версия разработана в 1998 году. В 2008 году вышла версия Open. MP 3. 0.

Ключевые элементы OMP конструкции для создания потоков (директива parallel), конструкции распределения работы между потоками Ключевые элементы OMP конструкции для создания потоков (директива parallel), конструкции распределения работы между потоками (директивы DO/for и section), конструкции для управления работой с данными (выражения shared и private для определения класса памяти переменных), конструкции для синхронизации потоков (директивы critical, atomic и barrier), процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num), переменные окружения (например, OMP_NUM_THREADS).

Реализации OMP Компиляторы Sun Studio поддерживают официальную спецификацию — Open. MP 2. 5 — Реализации OMP Компиляторы Sun Studio поддерживают официальную спецификацию — Open. MP 2. 5 — с улучшенной производительностью под ОС Solaris Visual C++ 2005 и 2008 поддерживает Open. MP 2. 0 в редакциях Professional и Team System, 2010 - в редакциях Professional, Premium и Ultimate, 2012 во всех редакциях. GCC 4. 2 поддерживает Open. MP, а некоторые дистрибутивы (такие как Fedora Core 5 gcc) включили поддержку в свои версии GCC 4. 1. Intel C++ Compiler поддерживает версию Open. MP 3. 0 а также Intel Cluster Open. MP для программирования в системах с распределённой памятью. IBM XL compiler PGI (Portland group) Pathscale HP

Реализация OMP Компилятор Intel /Qopenmp / -openmp Компилятор -fopenmp GFortran Реализация OMP Компилятор Intel /Qopenmp / -openmp Компилятор -fopenmp GFortran

OMP Parallel !$OMP PARALLEL [clause[[, ] clause]. . . ] block !$OMP END PARALLEL OMP Parallel !$OMP PARALLEL [clause[[, ] clause]. . . ] block !$OMP END PARALLEL

OMP Parallel COPYIN (list) DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE) FIRSTPRIVATE (list) OMP Parallel COPYIN (list) DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE) FIRSTPRIVATE (list) IF ( scalar_logical_expression) Specifies that the enclosed code section is to be executed in parallel only if the scalar_logical_expression evaluates to. TRUE. . Otherwise, the parallel region is serialized. If this clause is not used, the region is executed as if an IF(. TRUE. ) clause were specified. This clause is evaluated by the master thread before any data scope attributes take effect. Only a single IF clause can appear in the directive. NUM_THREADS ( scalar_integer_expression) Specifies the number of threads to be used in a parallel region. The scalar_integer_expression must evaluate to a positive scalar integer value. Only a single NUM_THREADS clause can appear in the directive. PRIVATE (list) REDUCTION (operator | intrinsic : list) SHARED (list)

OMP Do !$OMP DO [clause[[, ] clause]. . . ] do_loop [!$OMP END DO OMP Do !$OMP DO [clause[[, ] clause]. . . ] do_loop [!$OMP END DO [NOWAIT]] !OMP PARALLEL !$OMP DO DO I=1, N B(I) = (A(I) + A(I-1)) / 2. 0 END DO !$OMP END PARALLEL

OMP Do !$OMP PARALLEL !$OMP DO DO I=2, N B(I) = (A(I) + A(I-1)) OMP Do !$OMP PARALLEL !$OMP DO DO I=2, N B(I) = (A(I) + A(I-1)) / 2. 0 END DO !$OMP END DO NOWAIT !$OMP DO DO I=1, M Y(I) = SQRT(Z(I)) END DO !$OMP END DO NOWAIT !$OMP END PARALLEL

OMP Parallel Do !$OMP PARALLEL DO [clause[[, ] clause]. . . ] do-loop [!$OMP OMP Parallel Do !$OMP PARALLEL DO [clause[[, ] clause]. . . ] do-loop [!$OMP END PARALLEL DO] !$OMP PARALLEL DO DO I=1, N B(I) = (A(I) + A(I-1)) / 2. 0 END DO !$OMP END PARALLEL DO

OMP Parallel Do !$OMP PARALLEL DO DEFAULT(PRIVATE) REDUCTION(+: A, B) DO I=1, N CALL OMP Parallel Do !$OMP PARALLEL DO DEFAULT(PRIVATE) REDUCTION(+: A, B) DO I=1, N CALL WORK(ALOCAL, BLOCAL) A = A + ALOCAL B = B + BLOCAL END DO !$OMP END PARALLEL DO

OMP Sections !$OMP SECTIONS [clause[[, ] clause]. . . ] [!$OMP SECTION] block [!$OMP OMP Sections !$OMP SECTIONS [clause[[, ] clause]. . . ] [!$OMP SECTION] block [!$OMP SECTION block]. . . !$OMP END SECTIONS[NOWAIT]

OMP Sections !$OMP PARALLEL !$OMP SECTIONS !$OMP SECTION CALL XAXIS !$OMP SECTION CALL YAXIS OMP Sections !$OMP PARALLEL !$OMP SECTIONS !$OMP SECTION CALL XAXIS !$OMP SECTION CALL YAXIS !$OMP SECTIONъ CALL ZAXIS !$OMP END SECTIONS !$OMP END PARALLEL

OMP Barrier !$OMP BARRIER !$OMP PARALLEL !$OMP DO PRIVATE(i) DO i = 1, 100 OMP Barrier !$OMP BARRIER !$OMP PARALLEL !$OMP DO PRIVATE(i) DO i = 1, 100 b(i) = i END DO !$OMP BARRIER !$OMP DO PRIVATE(i) DO i = 1, 100 a(i) = b(101 -i) END DO !$OMP END PARALLEL

MPI Message Passing Interface разработка программ для кластеров и суперкомпьютеров стандартизацией MPI занимается MPI MPI Message Passing Interface разработка программ для кластеров и суперкомпьютеров стандартизацией MPI занимается MPI Forum ориентирован на системы с распределенной памятью

История MPI В MPI 1. 1 (опубликован 12 июня 1995 года, первая реализация появилась История MPI В MPI 1. 1 (опубликован 12 июня 1995 года, первая реализация появилась в 2002 году) поддерживаются следующие функции: коллективные взаимодействия процессов; взаимодействия в группах процессов; передача и получение сообщений между отдельными процессами; реализация топологий процессов; В MPI 2. 0 (опубликован 18 июля 1997 года) дополнительно поддерживаются следующие функции: динамическое порождение процессов и управление процессами; односторонние коммуникации (Get/Put); параллельный ввод и вывод; расширенные коллективные операции (процессы могут выполнять коллективные операции не только внутри одного коммуникатора, но и в рамках нескольких коммуникаторов). Версия MPI 2. 1 вышла в начале сентября 2008 года. Версия MPI 2. 2 вышла 4 сентября 2009 года. Версия MPI 3. 0 вышла 21 сентября 2012 года.

Реализация MPICH — самая распространённая бесплатная реализация, работает на UNIX-системах и Windows NT LAM/MPI Реализация MPICH — самая распространённая бесплатная реализация, работает на UNIX-системах и Windows NT LAM/MPI — ещё одна бесплатная реализация MPI. Поддерживает гетерогенные конфигурации, LAM (http: //www. lam-mpi. org) поддерживает гетерогенные конфигурации, пакет Globus и удовлетворяет IMPI(Interoperable MPI). WMPI — реализация MPI для Windows MPI/PRO for Windows NT — коммерческая реализация для Windows NT Intel MPI — коммерческая реализация для Windows / Linux Microsoft MPI входит в состав Compute Cluster Pack SDK. Основан на MPICH 2, но включает дополнительные средства управления заданиями. Поддерживается спецификация MPI-2. HP-MPI — коммерческая реализация от HP SGI MPT — платная библиотека MPI от SGI Mvapich — бесплатная реализация MPI для Infiniband Open MPI — бесплатная реализация MPI, наследник LAM/MPI Oracle HPC Cluster. Tools — бесплатная реализация для Solaris SPARC/x 86 и Linux на основе Open MPI MPJ — MPI for Java MPJ Express — MPI на Java

Спасибо за внимание Спасибо за внимание