Изучение структуры и работы пакета OpenMP


PRINT *, 'THERE ARE', NTHRDS, 'THREADS' END IF


Download 65.94 Kb.
bet2/3
Sana31.01.2024
Hajmi65.94 Kb.
#1820128
TuriПрограмма
1   2   3
Bog'liq
Практическая работа №5

PRINT *, 'THERE ARE', NTHRDS, 'THREADS'
END IF
C$OMP END PARALLEL
END
Программа на Си, складывающая в десять потоков массив a с массивом b (компилируется с использованием gcc-4.4 и более новых версий с флагом -fopenmp):
#include
#include

#define N 100


int main(int argc, char *argv[])


{
double a[N], b[N], c[N];
int i;
omp_set_dynamic(0); // запретить библиотеке openmp менять число потоков во время исполнения
omp_set_num_threads(10); // установить число потоков в 10


// инициализируем массивы
for (i = 0; i < N; i++)
{
a[i] = i * 1.0;
b[i] = i * 2.0;
}


// вычисляем сумму массивов
#pragma omp parallel for shared(a, b, c) private(i)
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];

printf ("%f\n", c[10]);


return 0;
}
OpenMP поддерживается многими современными компиляторами.
Компиляторы Sun Studio поддерживают спецификацию OpenMP 2.5 с поддержкой операционной системы Solaris; поддержка Linux запланирована на следующий выпуск. Эти компиляторы создают отдельную процедуру из исходного кода, располагающегося под директивой parallel, а вместо самой директивы вставляют вызов процедуры __mt_MasterFunction_ библиотеки libmtsk, передавая ей адрес искусственно созданной. Таким образом, разделяемые (shared) данные могут быть переданы последней по ссылке, а собственные (private) объявляются внутри этой процедуры, оказываясь независимыми от своих копий в других потоках. Процедура __mt_MasterFunction_ создает группу потоков (количеством 9 в приведенном выше примере на языке C), которые будут выполнять код конструкции parallel, а вызвавший её поток становится главным в группе. Затем главный поток организовывает работу подчиненных потоков, после чего начинает выполнять пользовательский код сам. Когда код будет выполнен, главный поток вызывает процедуру _mt_EndOfTask_Barrier_, синхронизирующую его с остальными.
Visual C++ 2005 и 2008 поддерживает OpenMP 2.0 в редакциях Professional и Team System, 2010 — в редакциях Professional, Premium и Ultimate, 2012 — во всех редакциях.
В GCC начиная с версии 4.2 реализована поддержка OpenMP для Си, C++ и Фортрана (на базе gfortran), а некоторые дистрибутивы (такие как Fedora Core 5) включили поддержку в GCC 4.1. В Clang и LLVM 3.7 поддерживается OpenMP 3.1.
Intel C++ Compiler, Intel Fortran Compiler и Intel Parallel Studio поддерживают версию OpenMP 3.0, а также Intel Cluster OpenMP для программирования в системах с распределённой памятью. Существуют также реализации в компиляторах IBM XL compiler, PGI (Portland group), Pathscale, HP.

Ключевые моменты:


1. Параллельная область: Это часть кода, которая будет выполняться параллельно нескольким потокам.
2. Управление количеством потоков: OpenMP позволяет управлять количеством потоков через директивы или переменные окружения.
3. Синхронизация: Директивы OpenMP также обеспечивают механизмы синхронизации потоков для избежания конфликтов доступа к данным.



Download 65.94 Kb.

Do'stlaringiz bilan baham:
1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling