我是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
在我的代码中:
我的代码如下:
!$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年旧)。