我有一个与OpenMP并行的fortran代码。这是代码的并行部分:
!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(iconf,d,randx, &
!$OMP& randy,randz,unit_cg,theta1,theta2,theta3,fr1,fr2,fr3,Q, &
!$OMP& plproduct_avg,correlation_term)
allocate(randx(num),randy(num),randz(num),unit_cg(num), &
& fr1(num),fr2(num),fr3(num),theta1(order,num), &
& theta2(order,num),theta3(order,num), &
& Q(nfftdim1,nfftdim2,nfftdim3))
!$OMP DO
do 250 iconf = 1,1600
write(6,*)'configuration number',iconf
{some calculations}
write(6,*)'correlation term of iconf =',iconf, &
& correlation_term(iconf)
250 continue
!$OMP END DO
deallocate(randx,randy,randz,unit_cg,fr1,fr2,fr3,theta1,theta2, &
& theta3,Q)
!$OMP END PARALLEL
当我在40个线程上运行此代码时(我在脚本40上设置线程数),程序进入40个循环,在输出文件中我有40个这样的行:
configuration number 161
有不同的数字。所以我发现所有40个线程都开始工作了。因此这行代码
write(6,*)'correlation term of iconf =',iconf, &
& correlation_term(iconf)
应该执行40次,输出文件中应该有40 correlation_term(iconf)
,但输出文件中只有37 correlation_term(iconf)
,所以我得出结论,3个线程不参与运行代码。< / p>
在下一步,程序只输入37个循环,只有35个循环有数据。似乎有些线程不参与运行,现在只有22个线程进行计算。
为什么这些线程不参与?我是否有并行错误?