Cheat sheet on OpenMP: https://www.openmp.org/wp-content/uploads/OpenMP-4.0-C.pdf
Gists: https://gist.github.com/ssstuvz/574c3d1eb663980a5487af2e773d2460
Скачайте код, скомпилируйте: $ <codefile.c> -o -fopenmp Укажите компилятор (cc), например, gcc для .c файлов в Ubuntu. Как запустить код: $ ./
-
Демонстрационные файлы – работающие примеры кодов для понимания OpenMP. Эти задания не оцениваются. omp_hello.c – простейшая программа печатающая ‘Hello world’. Введение в конструкцию ‘parallel’. Задание: а) научитесь вручную менять кол-во нитей, исполняемых в программе путем изменения переменной окружения: $ export OMP_NUM_THREADS=. b) научитесь задавать кол-во нитей внутри программы. omp_outmes.cpp – сравнение параллельного I/O C и C++. Пример на понимания понятия “threadsafe”. Пример конструкции critical. Компиляция: $ g++ OutMes.cpp -o -fopenmp omp_privateshared.c – пример общих и приватных переменных, конструкции ‘for’. Задание: запустите программу, разберитесь, что делают все команды с #pragma. omp_parsec.c – пример использования конструкции section. Задание: перед запуском, попытайтесь угадать вывод программы, потом проверьте. omp_sumarray.c – пример использования редукции. Обратите внимание на конструкцию #pragma omp parallel for – в чем разница между этой конструкцией и #pragma omp parallel … #pragma omp for
-
Программы с багами – примеры программ, которые надо починить. omp_bugreduction.c – код для скалярного произведения двух векторов. Дополнить функцию dotprod, проверить баги в #pragma omp, проверить результат. (20 %) omp_bugparfor.c –Найти и устранить ошибки. (20 %)
-
Написать параллельную программу, использующую метод Монте-Карло для оценки числа pi. Случайным образом (аккуратнее с генератором случайных чисел! Пример в лекции) кидаете точку в единичный квадрат. В этот же квадрат вписан круг. Если точка попала в круг, увеличиваете счетчик. Затем находите отношение точек, попавших в круг к общему числу точек. Зная площади квадрата и круга, находите приблизительно число pi. (60 %)
Note: clock() measures the sum of wall clocks across all threads. Use omp_get_wtime() instead (it returns value in seconds).