在FORTRAN中实现OpenMP任务?

时间:2015-04-09 16:45:58

标签: parallel-processing crash fortran runtime-error openmp

我是OpenMP的新手,我正试图对已经存在的串行代码进行并行化。代码大约有40000行,所以我不能在这里发帖。

我正在尝试在FORTRAN中实现以下代码(在C中):

 my_pointer = listhead;
 #pragma omp parallel
 {
      #pragma omp single nowait
      {
      while(my_pointer) {
      #pragma omp task firstprivate(my_pointer)
      {
      (void) do_independent_work (my_pointer);
      }
 my_pointer = my_pointer->next ;
 }
 } // End of single - no implied barrier (nowait)
 } // End of parallel region - implied barrier

在我的代码中:

  • my_pointer = zi;
  • listhead = z%first;
  • zi%kc(zi%np)是一个大小为zi%np的数组;
  • do_independent_work(my_pointer)= ALLOCATE(zi%kc(zi%np))并将向量初始化为0;

我的代码如下:

!$OMP PARALLEL
        !$OMP SINGLE 
            DO WHILE(ASSOCIATED(zi))
                IF (zi%compt) THEN
                    !$OMP TASK
                         ALLOCATE(zi%kc(zi%np), STAT = AllocateStatus )
                         IF (AllocateStatus /= 0) STOP "*** zi%kc Allocate failed ***"
                         FORALL(i=1:zi%np)
                         zi%kc(i) = 0.0_SDP
                         END FORALL 
                     !$OMP END TASK
                ENDIF
                zi => zi%next
            ENDDO
        !$OMP END SINGLE NOWAIT
!$OMP END PARALLEL

问题是:此代码的串行版本运行没有任何问题,而我实现的并行版本由于某种原因崩溃。

我在做一些根本错误的事情?

另外,如果我将 firstprivate(zi)放在“!$ OMP TASK”旁边,我会收到“错误1错误#7266:OpenMP * FIRSTPRIVATE,LASTPRIVATE或者不允许使用F90指针减少条款。“

我在Visual Studio 2010中使用Parallel Studio XE 2011.

1 个答案:

答案 0 :(得分:0)

在OpenMP 3.1中允许Fortran指针,你应该更新你的编译器(2011年是旧的)。