Параллельные вычисления Сергей Васильевич Федоров, Лекция № 3 Распараллеливание в рамках Win32 API Открытый стандарт OpenMP 2. Компиляция, сборка и отладка в Intel Visual Fortran. Кодовый Сегмент, Сегмент данных, Стэк, Куча Процессы и Потоки, различие между ними. SIMD. 2.1 MS Visual Studio и Распараллеливание в рамках Win32 API: Критические секции, События, Семафоры, Mutex 2.2 Открытый стандарт OpenMP. Отладка параллельного исполнения потоков с помощью Intel VTune. Обнаружение ошибок с помощью Intel Thread Checker. Оптимизация исполнения с помощью Intel Thread Profiler. Сегментация виртуального адресного пространства Очереди, таблицы прерываний Cегменты Модуля, Вызов и выход из функции, … Кодовый сегмент, Read only Cегмент lданных, Процесс -Собственное адресное пространство, -Общие таблицы системных вызовов … СТЭК: Локальные переменные, Аргументы функций Отдельные для каждого потока SIMD Single Instructions Multiple Data КУЧА: общие данные для всех потоков Поток -Общее адресное пространство внутри процесса, -Собственный Стэк вызовов исполняемых процедур типы массивов, область видимости, размещение, очистка после выхода из программы явно заданные, Arr(-3:10) явно заданные, Arr(-3:10) неявно заданные, ,allocatable:: Arr(:) глобальные (модуль), сегмент данных, локальная (функция), СТЭК , функции локальная (функция), КУЧА, функции неявно заданные, , pointer:: Arr(:) локальная (функция), глобальные (модуль), КУЧА, программы Распараллеливание в рамках Win32 API Базовое Распараллеливание с помощью Потоков в рамках одного процесса Инструменты синхронизации потоков (See MSDN Help) Критические секции, (Защита от одновременного доступа к коду) 1. EnterCriticalSection, ….. КОД 2. LeaveCriticalSection События, (Асинхронная Защита от обобщенных событий) 1. WaitForSingleObject(event) 2. PulseEvent – всем ждущим потокам Семафоры, (Ограничение одновременного использования ресурса) 1. CreateSemaphore(num) – по числу разреш.потоков 2. WaitForSingleObject(semaphor) - открыт или закрыт 3. ReleaseSemaphore – освобождение занятого ресурса Mutex (Защита от одновременного использования ресурса) 1. CreateMutex – ассоциация с ресурсом по имени 2. WaitForSingleObject(mutex) - завладеет ресурсом или нет 3. ReleaseMutex – освобождение занятого ресурса Mutex синхронизирует процессы, и защищает от взаимоблокировок (deadlock) Параллельные вычисления Шаблонный пример решения линейного уравнения диффузии. 2 T 2 2 T 2 2 T , t x y Ti ,nj1 Ti ,nj dt n n n n n n n n 1 Ti 1, j Ti , j Ti , j Ti 1, j 1 Ti , j 1 Ti , j Ti , j Ti , j 1 dx dx dx dy dy dy Ti n1, j Ti n1, j 2Ti ,nj dx*dx n 1 i, j T T Ti ,nj 1 Ti ,nj 1 2Ti ,nj n i 1, j dy*dy T n i 1, j , T dt = dx*dy/4, dx = dy, n i , j 1 T n i , j 1 / 4, Перенормировка координат, чтобы получить отображение с единичной нормой. Параллельные вычисления DO iter = 1,iterMax; logo =.true. forall (i=1:n,j=1:n,abs(0.25*(T(i-1,j)+T(i+1,j)+T(i,j-1)+T(i,j+1))-T(i,j))>eps) T(i,j)=0.25*(T(i-1,j)+T(i+1,j)+T(i,j-1)+T(i,j+1)); logo(i,j) =.false. end forall; if( all(logo) ) exit ENDDO double precision::Ti1,Tj1(n),Tnew,Tj1new(n) ! Tj1(:)=T(:,j-1), Ti1=T(i-1,j) DO iter = 1,iterMax ; Tj1(:)=T(:,0); logo =.true. DO j=1,n ; Ti1=T(0,j) DO i=1,n Tnew= 0.25*(Ti1+T(i+1,j)+Tj1(i)+T(i,j+1)) Ti1 = T(i,j); Tj1new(i) = Tnew; logo(i,j) = abs(Tnew-T(i,j))..le.eps ENDDO; Tj1(:) = T(:,j); T(:,j) = Tj1new(:) ENDDO; if( all(logo) ) exit ENDDO n 1 i, j T T n i 1, j T n i 1, j T n i , j 1 T n i , j 1 / 4, Параллельные вычисления Задача: решить нелинейное уравнение диффракции в условиях бистабильности однородных решений. E g0 a0 2 i d E 1 t 1 I / I g 1 I / Ia E t 0 E , x 4 y 4 I 0 Exp , wx wy Параметры Задачи: d=0.06 - малый коэффициент диффузии поля, Ig=10 - интенсивноть насыщения активной среды, Ia=1 - интенсивноть насыщения пассивной среды, g0=2.11 - коэффициент усиления слабого сигнала, a0=2.00 - коэффициент поглощения слабого сигнала, Nx=Ny=128 - число точек по поространственным коорд-м, AX =AY= 50 - величина области счета, dx=AX/(NX-1), dt = 0.1 - шаг по времени, wx=wy=12, I0 = 7.0