Изучение структуры и работы пакета OpenMP
PRINT *, 'THERE ARE', NTHRDS, 'THREADS' END IF
Download 65.94 Kb.
|
Практическая работа №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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling