Fortran 某些线程不参与代码的运行
我有一个与OpenMP并行的fortran代码。这是代码的并行部分:Fortran 某些线程不参与代码的运行,fortran,openmp,Fortran,Openmp,我有一个与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) allo
!$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\u term(iconf)
,但输出文件中只有37个correlation\u term(iconf)
,因此我得出结论,3个线程不参与代码的运行
下一步程序只输入37个循环,只有35个循环有数据。似乎有些线程不参与运行,现在只有22个线程进行计算
为什么这些线程不参与?我并联有错误吗 是的,我的代码现在正在运行,现在我有22行代码,比如iconf的相关项=…你的结论可能不正确。尝试制作一个完全独立的简单示例进行验证。同时写下线程编号(
omp\u get\u thread\u num()
)并显示您的实际输出文件。谢谢Vladimir。到目前为止,我有236个循环,只有221个相关项(iconf)
。我不明白这15条发生了什么。嗨,马克,我的代码将持续两周,所以我用少量输入运行代码,并按照弗拉基米尔的建议编写了omp\u get\u thread\u num()
。我把线数设为16。当我设置循环16的上限(而不是1600)时,一切正常。但当我设置循环40的上限(超过线程数)时,37个循环进行计算并终止(在合理的时间内),但3个循环仍然没有数据,代码无法退出并行区域并停止。这就是问题所在。iconf
值的代码没有完成循环<代码>{some calculations}在“永远”模式下暂停或运行。随着计算的进行,还会遇到iconf
的其他值,这些值也会暂停或永远运行。我并联有错误吗?更可能的是,错误出现在您没有向我们展示的代码中,或者在您对它的理解中。是的,我的代码现在正在运行,现在我有22行代码,比如correlation term of iconf=…
您的结论可能不正确。尝试制作一个完全独立的简单示例进行验证。同时写下线程编号(omp\u get\u thread\u num()
)并显示您的实际输出文件。谢谢Vladimir。到目前为止,我有236个循环,只有221个相关项(iconf)
。我不明白这15条发生了什么。嗨,马克,我的代码将持续两周,所以我用少量输入运行代码,并按照弗拉基米尔的建议编写了omp\u get\u thread\u num()
。我把线数设为16。当我设置循环16的上限(而不是1600)时,一切正常。但当我设置循环40的上限(超过线程数)时,37个循环进行计算并终止(在合理的时间内),但3个循环仍然没有数据,代码无法退出并行区域并停止。这就是问题所在。iconf
值的代码没有完成循环<代码>{some calculations}在“永远”模式下暂停或运行。随着计算的进行,还会遇到iconf
的其他值,这些值也会暂停或永远运行。我并联有错误吗?更可能的是,错误在于您没有向我们展示的代码内部,或者您对它的理解。