0

我是 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

提前感谢您的任何建议或帮助。

4

2 回答 2

1

我认为这条线

   call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE

可能会导致一些问题。您的系统上的实现是random_number线程安全的吗?我一无所知,我对您的编译器或操作系统一无所知。如果它不是线程安全的,那么当 OpenMP 线程都开始使用随机数生成器时,您的程序可能会做很多事情;这些事情包括崩溃或死锁。

如果实现是线程安全的,您将想弄清楚如何确保线程要么生成或不生成相同的随机数序列。编写在每个线程中使用相同随机数或在不同线程中使用不同序列的程序是完全明智的,但你应该弄清楚你得到的就是你想要的。

如果随机数生成器是线程安全的并且为每个线程生成不同的序列,那么这些序列是否通过了单线程随机数生成器可能通过的那种随机性测试?

在并行程序中生成适当独立的伪随机数序列是相当棘手的;当然不是我可以在 SO 答案的空间中涵盖的内容。

虽然您想出了一个可能有帮助的解决方法,但它可能是在代码的顺序部分中生成您需要的所有随机数(可能是到一个数组中),并让不同的线程从数组中读取不同的元素。

于 2013-03-12T17:51:36.587 回答
0

我想在集群上运行与独立进程相同的代码

那么你不想要 OpenMP。OpenMP 是关于在单个地址空间内利用并行性。

我建议你看看 MPI,如果你想在集群上操作

于 2013-03-13T15:56:41.770 回答