2016-08-05 2 views
2

В настоящее время я пытаюсь использовать задачу . Конструкция OpenMP 4.0, в том числе , зависит от оператора для моих кодов Fortran. Поэтому я создаю следующий пример, который должен заполнить первую строку матрицы цифрами от 1 до M заданием и заполнить оставшиеся элементы каждой задачей каждый раз, когда элемент в первой строке будет готов. Это приводит к следующей части кода:OpenMP - Зависимость от задачи в Fortran

PROGRAM OMP_TEST 
    IMPLICIT NONE 

    INTEGER K,L 
    INTEGER M 
    PARAMETER (M = 8) 
    INTEGER A(M,M) 

    A(1:M, 1:M) = 0 

    !$omp parallel 
    !$omp single 
    DO L=1, M 
     !$omp task depend(out:A(1,L)) default(shared) 
     A(1,L) = L 
     !$omp end task 
     DO K = 2, M 
      !$omp task depend(in:A(1,L)) default(shared) 
      A(K,L) = A(1,L) 
      !$omp end task 
     END DO 
    END DO 
    !$omp taskwait 
    !$omp end single 
    !$omp end parallel 

    DO K =1 , M 
     WRITE(*,*) A(K,1:M) 
    END DO 
END PROGRAM 

Compile с Intel Fortran 15 компилятор, который в соответствии с документацией осведомлены о зависят заявление. Но результат, напечатанный на экране, отличается при каждом выполнении. Даже начальные нули матрицы остаются в некоторых положениях. Например:

 1   2   3   4   5   6 
     7   8 
     0   0   0   0   0   0 
     0   0 
     0   0   3   4   0   0 
     0   8 
     1   0   3   4   0   6 
     0   8 
     1   0   3   4   5   6 
     0   8 
     1   2   3   4   5   6 
     7   8 
     0   2   3   4   5   6 
     7   0 
     1   2   3   4   5   6 
     0   8 

Почему зависимости между задачей не работают правильно, как я ожидаю, что это такое, что значения от 1 до 8 в каждой строке?

+0

Компиляция с использованием gcc 5.4 приводит к аналогичному неправильному результату. –

ответ

2

Заявление

!$omp task depend(in:A(1,L)) default(shared) 
A(K,L) = A(1,L) 
!$omp end task 

считает K как общие, но во время выполнения этой задачи значение K могло быть изменено в другом месте (на самом деле, это может произойти только из-за резьбу исполняющего сингл - который зацикливается на DO K = 2,M). Вы можете исправить это, добавив предложение firstprivate в конструкцию !$omp. Это условие гарантирует, что K будет приватным, но также наследует значение всякий раз, когда эта задача создается.

Этот факт применяется аналогично L в том же самом заявлении, а также о задаче предыдущих предыдущих строк. Следующий код работал для меня с использованием компилятора Intel Fortran версии 16.0.

PROGRAM OMP_TEST 
    IMPLICIT NONE 

    INTEGER K,L 
    INTEGER M 
    PARAMETER (M = 8) 
    INTEGER A(M,M) 

    A(1:M, 1:M) = 0 

    !$omp parallel 
    !$omp single 
    DO L=1, M 
     !$omp task depend(out:A(1,L)) default(shared) firstprivate(L) 
     A(1,L) = L 
     !$omp end task 
     DO K = 2, M 
      !$omp task depend(in:A(1,L)) default(shared) firstprivate(K,L) 
      A(K,L) = A(1,L) 
      !$omp end task 
     END DO 
    END DO 
    !$omp taskwait 
    !$omp end single 
    !$omp end parallel 

    DO K =1 , M 
     WRITE(*,*) A(K,1:M) 
    END DO 
END PROGRAM 

Update

После изучения комментария Grisu, где он/она относится к примерам Intel, я понял, что K и L должны быть уже firstprivate, так как они являются переменными цикла в DO. Однако, похоже, добавление default(shared) меняет это поведение. Следующий код, в котором явно указаны общие переменные, и default был удален, также работает в Intel Fortran 16.0.

PROGRAM OMP_TEST 
    IMPLICIT NONE 

    INTEGER K,L 
    INTEGER M 
    PARAMETER (M = 8) 
    INTEGER A(M,M) 

    A(1:M, 1:M) = 0 

    !$omp parallel 
    !$omp single 
    DO L=1, M 
     !$omp task depend(out:A(1,L)) shared(A) 
     A(1,L) = L 
     !$omp end task 
     DO K = 2, M 
      !$omp task depend(in:A(1,L)) shared(A) 
      A(K,L) = A(1,L) 
     !$omp end task 
     END DO 
    END DO 
    !$omp taskwait 
    !$omp end single 
    !$omp end parallel 

    DO K =1 , M 
     WRITE(*,*) A(K,1:M) 
    END DO 
END PROGRAM 
+0

Спасибо, что интересно, примеры на веб-странице Intel не зависят от оператора firstprivate (https://software.intel.com/en-us/node/581281) и многих других примеров. Но так оно и работает, и я могу продолжить эксперименты. –

Смежные вопросы