我是OpenMP的新手,目前无法访问我的工作站,我可以查看详细信息。有一个简单的问题来设置基础知识,然后再转到手上。
假设我有一个用FORTRAN90编写的串行程序,它使用迭代生成一个映射,并在演变后给出变量的最终值,代码如下:
call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE
do i=1,50000 !! ITERATION OF THE SYSTEM
xf=4.d0*xi*(1.d0-xi) !! EVOLUTION OF THE SYSTEM
xi=xf
enddo !! END OF SYSTEM ITERATION
print*, xf
我希望在100个不同的随机初始条件下运行与集群上的独立进程相同的代码,并查看输出如何随初始条件而变化。用于此目的的串行程序如下所示:
do iter=1,100 !! THE INITIAL CONDITION LOOP
call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE
do i=1,50000 !! ITERATION OF THE SYSTEM
xf=4.d0*xi*(1.d0-xi) !! EVOLUTION OF THE SYSTEM
xi=xf
enddo !! END OF SYSTEM ITERATION
print*, xf
我能想到的OpenMP实现是否有效?我能提出的代码如下:
!$ OMP PARALLEL PRIVATE(xi,xf,i)
!$ OMP DO
do iter=1,100 !! THE INITIAL CONDITION LOOP
call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE
do i=1,50000 !! ITERATION OF THE SYSTEM
xf=4.d0*xi*(1.d0-xi) !! EVOLUTION OF THE SYSTEM
xi=xf
enddo !! END OF SYSTEM ITERATION
print*, xf
!$ OMP ENDDO
!$ OMP END PARALLEL
提前感谢您提出任何建议或帮助。
答案 0 :(得分:1)
我认为这一行
call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE
可能会导致一些问题。您系统上random_number
的实现是否是线程安全的?我没有线索,我对你的编译器或操作系统一无所知。如果它不是线程安全的,那么当OpenMP线程都开始使用随机数生成器时,你的程序可能会做很多事情;那些事情包括崩溃或死锁。
如果实现是线程安全的,您将需要弄清楚如何确保线程是否全部生成相同的随机数序列。编写在每个线程中使用相同随机数的程序,或者在不同线程中使用不同序列的程序是完全合理的,但是你应该弄清楚你得到的是你想要的。
如果随机数生成器是线程安全的并且为每个线程生成不同的序列,那么这些序列是否会通过单线程随机数生成器可能通过的随机性测试?
在并行程序中生成适当独立的伪随机数序列非常棘手;当然不是我在SO答案的空间里可以涵盖的东西。
虽然你想出了一个可能有用的解决办法,但是在你的代码的连续部分中生成你需要的所有随机数(也许是一个数组)并让不同的线程读出不同的元素。阵列。
答案 1 :(得分:0)
我想在集群上运行与独立进程相同的代码
然后你不想要OpenMP。 OpenMP旨在利用单个地址空间内的并行性 。
如果您想在群集上运行,我建议您查看MPI