Skip to main content
 首页 » 编程设计

parallel-processing之在FORTRAN中实现OpenMP任务

2025年05月04日27kenshinobiy

我是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))并将 vector 初始化为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或REDUCTION子句中不允许使用F90指针。”

    我正在将Parallel Studio XE 2011与Visual Studio 2010一起使用。

    请您参考如下方法:

    OpenMP 3.1中允许使用Fortran指针,您应该更新编译器(2011年旧)。