3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
|
|
1 | |
Не удается распараллелить цикл через OpenMP в Fortran20.04.2020, 23:02. Показов 1058. Ответов 7
Метки нет (Все метки)
Здравствуйте! Пытаюсь распараллелить цикл do в Фортране (Inteal Parallel Studio поверх MSVS) на 6 ядер (процессор AMD FX-6300). Для чего обрамил данный цикл директивами
!$OMP DO мой цикл do !$OMP END DO В свойствах проекта поставил Generate Parallel Code (/Qopenmp). Однако наблюдение за запущенной программой в Process Explorer, что существует лишь один Thread ID, т.е. программа не распараллелилась. Что можно сделать?
0
|
20.04.2020, 23:02 | |
Ответы с готовыми решениями:
7
Не удается правильно распараллелить программу табулирования функции, используя OpenMP Распараллелить цикл со сложной индексацией используя OpenMP Распараллелить, используя OpenMP Распараллелить метод Гаусса (OpenMP) |
25.04.2020, 01:57 | 2 |
Экспериментировал как-то из интереса, но уже забыл что и как. Нужно компилятору сообщить о применении распрараллеливающих инструкций, поставить ключ, это Вы вроде бы сделали. Но по моему там еще дополнительные инструкции должны быть, нужно изучать литературу. Однако самым принципиальным является вопрос возможности распараллеливания, тип решаемой задачи. Если у Вас компилятор intel, то можно посмотреть в сторону собственных средств распараллеливания фортран программ. Хотя такой способ вероятно лучше подходит для новых программ.
0
|
3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
|
|
27.04.2020, 12:33 [ТС] | 3 |
Не очень понял это предложение. Интеловский компилятор. Т.е. у него есть еще какие-то собственные возможности распараллеливания? Это небольшой расчет, написанный сейчас, а не старая программа. Задача распараллеливается абсолютно прозрачно, т.к. снаружи стоит цикл в котором считаются точки на графике - соответственно нужно разделить весь диапазон значений на поддиапазоны и отдать из считаться в разные процессы.
Добавлено через 11 минут По опциям компилятора буду читать.
0
|
27.04.2020, 13:37 | 4 |
Не именно у компилятора, а в самом стандарте фортрана. Просто свободный компилятор Gfortran, к примеру, не все поддерживает, насколько успевают разработчики включать новшества из стандартов, настолько и поддерживает. Это можно посмотреть на сайте, что включено, что планируется в предстоящей версии и т.п. А вот разработчики Intel Fortran пошустрее в этом смысле, но так этот компилятор и стоит не мало.
Из того что я знаю это так называемые комассивы coarry и параллельный цикл do concurrent. Сам не пользуюсь, нет надобности (как нет и iFort-а), но если Вам нужно поизучайте, вполне возможно Вам этого будет достаточно. Это кроме OpenMP и MPI, именно собственные средства языка.
0
|
3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
|
|
25.05.2020, 16:23 [ТС] | 5 |
Распараллелить на 6 потоков (тредов) удалось после включения опции компилятора /Qopenmp в разделе Language. Как оказалось, эта опция объявляет макрос _OPENMP. Т.е., оказывается, макросы могут объявляться опциями компилятора, без объявления в исходном тексте программы.
Теперь, когда опция указана в код нужно добавить #ifdef _OPENMP include 'omp_lib.h' #endif дабы включить заголовочный файл omp.h Далее нужно объявлять параллельную область !$omp parallel shared(z) и внутри нее параллельный цикл !$omp do private(x,y)& schedule(static) тело цикла !$omp end do !$omp end parallel z- разделяемая переменная, x,y - приватные (в каждом процессе свои значения, например счетчик цикла и др.) Однако есть еще одна хитрость. Если в цикле вызываются функции, то это уже не параллельный фрагмент (parallel construct), а параллельная область (parallel region, терминология из книги Гергеля). Т.е. в эту параллельную область входит уже и код этой функции и код других функций, которые она вызывает. Тут и возникает проблема в том, что через глобальные переменные в такую функцию ничего не передашь (через глоб. константы можно), поэтому приходится увеличивать список аргументов функции. В параллельную область можно вставить еще конструкцию !$omp single nthr=OMP_GET_NUM_THREADS(); print *,'number of threads= ',nthr !$omp end single чтобы узнать на сколько потоков распараллелилось. В моем случае на процессоре AMD FX-6300 получилось 6 потоков, а выигрыш по времени составил где-то 3,6 раз. Правда это измерялось на очень небольшой выборке. На выборке побольше выигрыш может оказаться большим. В программе Process Explorer загрузка процессора составляла 16,6% без распараллеливания и 96% при его наличии.
1
|
155 / 135 / 9
Регистрация: 21.10.2012
Сообщений: 413
|
|
25.05.2020, 17:49 | 6 |
0
|
3 / 3 / 0
Регистрация: 16.01.2017
Сообщений: 11
|
|
25.05.2020, 20:31 [ТС] | 8 |
chessman2, код постоянно меняю. Посмотрите лучше интеловский пример, откуда я это и взял - http://saddleback.atmos.colost... sample.f90.
WH, как-то указывал вроде опцию optimization/parallelization/yes (не помню точно) и вроде несколько потоков создавалось, но забил на это т.к. руками через OpenMP как-то понятнее. Coarray и т.д. не смотрел.
1
|
25.05.2020, 20:31 | |
25.05.2020, 20:31 | |
Помогаю со студенческими работами здесь
8
Распараллелить метод Зейделя-Гаусса используя OpenMP Распараллелить несколько разных процедур с помощью OpenMP Как распараллелить процедуру Fortran OMP Не могу разобраться с OpenMP! Как правильно распараллелить формулу? Не удаётся распараллелить программу Распараллелить цикл Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |