Добрый день,
не могли бы вы помочь ответить вот на какой вопрос:
внутри PARALLEL блока идет вызов подпрограммы, которая,
схематично, выполняет следующую последовательность действий:
Предположим, что программа запускается на N вычислительных узлах и на
каждом узле запускаем два треда.
Тогда наблюдается такая картина, что оба треда на каждом вычислительном
узле заходят в эту функцию, но РОВНО один из этих двух успешно
зовет ALLOCATE и переходит к выполнению следующей строчки, а ДРУГОЙ
застревает в вызове ALLOCATE и не переходит к выполнению следующей
за вызовом ALLOCATE строчки.
Скажите, пожалуйста, в чем может быть дело.
Баг или фича :)
Во-первых, проверьте, используете ли Вы версию скрипта компиляции, заканчивающуюся на _r.
Во-вторых, попробуйте посмотреть, что говорит стандарт OpenMP про allocatable-массивы в Фортране.
К слову, следующий C-код успешно отрабатывает на моей персоналке:
* Compilation:
* $> gcc -fopenmp -Wall -Wextra openmp.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define N 4
#define NUM_THREADS 3
int main()
{
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
int *a = (int *)malloc(N * sizeof(a[0]));
int tn = omp_get_thread_num();
int i, t;
/* Fill-in array */
for (i = 0; i < N; ++i)
a[i] = tn * N + i;
/* Print array */
for (t = 0; t < NUM_THREADS; ++t)
{
if (t == tn)
{
printf("%d: ", tn);
for (i = 0; i < N; ++i)
printf("%d ", a[i]);
putchar('\n');
}
#pragma omp barrier
}
/* Clean-up */
free(a);
}
return EXIT_SUCCESS;
}
Спасибо за комментарий.
Я использовал версию mpixlf77_r.
Когда заменил на mpixlf90_r - все заработало.
Как появится возможность, постараюсь написать простейший
тест-кейс (быть может, подойдет и ваш пример).
Или известно, что (mpixlf77_r + MPI + OpenMP)
могут вызвать проблемы?