Основы Fortran 2.pptx
- Количество слайдов: 35
Основы Fortran Часть 2 Фирсин Антон Александрович
Почему фортран? Множество свободно доступных математических алгоритмов Высокая производительность, достижимая средствами языка Реализация параллельных алгоритмов средствами компилятора Кроссплатформенность
Технологии повышения производительности SSE векторизация OMP параллелизация MPI
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: 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 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 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 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 WAS VECTORIZED.
Пример 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 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 A(I) = A(I) + A(I-X) ENDDO end
Пример 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 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. 9) remark: LOOP WAS VECTORIZED.
Пример 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 ведут несколько крупных производителей вычислительной техники и программного обеспечения, чья работа регулируется некоммерческой организацией, называемой Open. MP Architecture Review Board (ARB). Первая версия появилась в 1997 году, предназначалась для языка Fortran. Для С/С++ версия разработана в 1998 году. В 2008 году вышла версия Open. MP 3. 0.
Ключевые элементы OMP конструкции для создания потоков (директива parallel), конструкции распределения работы между потоками (директивы DO/for и section), конструкции для управления работой с данными (выражения shared и private для определения класса памяти переменных), конструкции для синхронизации потоков (директивы critical, atomic и barrier), процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num), переменные окружения (например, OMP_NUM_THREADS).
Реализации 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 Parallel !$OMP PARALLEL [clause[[, ] clause]. . . ] block !$OMP END PARALLEL
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 [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)) / 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 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 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 SECTION block]. . . !$OMP END SECTIONS[NOWAIT]
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 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 Forum ориентирован на системы с распределенной памятью
История 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 — ещё одна бесплатная реализация 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
Спасибо за внимание


