Его широкое внедрение в последующие годы обеспечило коренной перелом в решении проблемы переносимости параллельных программ, разрабатываемых в рамках разных подходов, использующих модель передачи сообщений в качестве модели выполнения.
Обобщение и стандартизация различных библиотек передачи сообщений привели в 1993 году к разработке стандарта MPI (Message Passing Interface).
Односторонние коммуникации и средства синхронизации для организации взаимодействия процессов через общую память (для эффективной работы на системах с непосредственным доступом процессоров к памяти других процессоров)
Параллельные операции ввода-вывода (для эффективного использования существующих возможностей параллельного доступа многих процессоров к различным дисковым устройствам)
Появление большого количества языков программирования, реализующих данную концепцию, например Modula-2, ADA
Процессоры соединены с модулями памяти либо через общую шину, либо через коммутатор. Это позволяет обеспечить общее адресное пространство нескольким процессорам.
Интерфейс OpenMP задуман как стандарт для программирования на масштабируемых SMP-системах (SSMP,ccNUMA, etc.) в модели общей памяти (shared memory model).
Программа на языке OpenMP является последовательно-параллельной. Последовательные участки выполняются корневым процессом. Для выполнения параллельных участков образуются нити.
Параллельная программа представляет собой систему нитей (threads), взаимодействующих посредством общих переменных и примитивов синхронизации.
Нить — легковесный процесс, имеющий с другими нитями общие ресурсы, включая общую оперативную память.
Эта модель может использоваться только на многопроцессорных системах с общей памятью или с DSM (Distributed Shared Memory — распределенная общая память)
Достаточно гибкий механизм, предоставляющий разработчику большие возможности контроля над поведением параллельного приложения.
Программа на однопроцессорной платформе может быть использована в качестве последовательной программы, т.е. нет необходимости поддерживать последовательную и параллельную версии.
На каждом уровне вложенности циклов тела циклов могут выполняться независимо друг от друга. Чтобы распараллелить приведенный код вставим прагму #pragma omp parallel for перед самым внешним циклом, так как это даст наибольший выигрыш в производительности. В распараллеленном цикле переменные array, array1, array2 и dim являются общими для потоков, а переменные i, j, k являются частными для каждого потока. Приведенный выше код теперь становится таким:
for (i = 0; i < dim; i++)
{ for (j = 0; j < dim; j++)
{ for (k = 0; k < dim; k++)
{array[i][j] += array1[i][k] * array2[k][j];}
}
}
#pragma omp parallel for shared(array, array1, array2, dim) private(i, j, k)
for (i = 0; i < dim; i++)
{ for (j = 0; j < dim; j++)
{ for (k = 0; k < dim; k++)
{array[ii[j] = array1[i][k] * array2[k][jj;}
}
}
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ OPENMP
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть