Parallel processing 在OpenMP中读取变量是否会成为数据竞争?

Parallel processing 在OpenMP中读取变量是否会成为数据竞争?,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,为什么这个OpenMP fortran程序工作?out的每个元素都等于num?并行循环中的每个线程可能同时读取变量num。我认为这是不可接受的 program example implicit none integer i integer, parameter :: n = 100000 double precision :: num double precision, dimension(n) :: out num = 1.12345678

为什么这个OpenMP fortran程序工作?out的每个元素都等于num?并行循环中的每个线程可能同时读取变量num。我认为这是不可接受的

  program example
    implicit none
    integer i
    integer, parameter :: n = 100000
    double precision :: num
    double precision, dimension(n) :: out

    num = 1.123456789123456789123456d-5
    out = 0.d0

    !$OMP PARALLEL
    !$OMP DO
    do i=1,n
      out(i) = num
    enddo
    !$OMP END DO
    !$OMP END PARALLEL

    do i=1,n
      if (out(i).ne.num) print*,'Problem with ',i
    enddo

  end program

非常感谢您提供的见解。

在openMP中默认情况下共享变量,因此可以从所有线程访问它们。此外,您没有写入num,因此即使所有线程都在访问相同的内存,也不会有问题。

在openMP中默认共享变量,因此可以从所有线程访问它们。此外,您没有写入num,因此即使所有线程都在访问相同的内存(此处可能没有),也不会有问题

在OpenMP中读取变量是否会成为数据竞争

任何竞争都是发生在两件事情之间的,因此读取可以是竞争的一部分。然而,两个动作之间的竞争是一场竞赛,根据两个动作发生的顺序,必须有不同的结果。 考虑到我们正在考虑的并行程序中可能的操作是在不同线程中进行读写,我们有四种可能的情况:

Read,Read:没有值被更改,并且没有代码能够检测到这两次读取至少发生在哪个顺序,除非查看元数据,例如在具有缓存的系统中的代码性能:-。 读,写:这显然可以是一场比赛;写入是否赢得比赛将影响将被读取的值。 Write,Read:与案例2 Read,Write一样,Read看到的结果受顺序的影响。 写,写:这里我们也有一个竞赛,因为我们假设有人最终会读取值,他们看到的值取决于写入的顺序。 因此,读取一个变量可能是比赛的一部分。 然而,如果你的问题是如果一个变量是只读的,那么你的答案是否定的

在OpenMP中读取变量是否会成为数据竞争

任何竞争都是发生在两件事情之间的,因此读取可以是竞争的一部分。然而,两个动作之间的竞争是一场竞赛,根据两个动作发生的顺序,必须有不同的结果。 考虑到我们正在考虑的并行程序中可能的操作是在不同线程中进行读写,我们有四种可能的情况:

Read,Read:没有值被更改,并且没有代码能够检测到这两次读取至少发生在哪个顺序,除非查看元数据,例如在具有缓存的系统中的代码性能:-。 读,写:这显然可以是一场比赛;写入是否赢得比赛将影响将被读取的值。 Write,Read:与案例2 Read,Write一样,Read看到的结果受顺序的影响。 写,写:这里我们也有一个竞赛,因为我们假设有人最终会读取值,他们看到的值取决于写入的顺序。 因此,读取一个变量可能是比赛的一部分。
但是,如果您的问题是如果只读取变量,是否真的存在竞争?那么答案是否定的。

谢谢!您能否详细说明一下:即使所有线程都在访问实现定义的相同内存,也不会有问题。您所定义的实现是什么意思?为什么可以同时读取num?嗨,我刚才在考虑数据局部性。通常对于共享变量,相同的地址被传递给线程。但是在这里num可以完全内联,因为它是一个双精度的,并且你永远不会改变,如果是这样的话,那么它就没有一个共享地址。解释隐式共享属性Hanks!您能否详细说明一下:即使所有线程都在访问实现定义的相同内存,也不会有问题。您所定义的实现是什么意思?为什么可以同时读取num?嗨,我刚才在考虑数据局部性。通常对于共享变量,相同的地址被传递给线程。但是在这里num可以完全内联,因为它是一个双精度的,并且你永远不会改变,如果是这样的话,那么它就没有一个共享地址。解释隐式共享属性hanks。是的,我的问题措辞会更好,因为如果只读取变量,是否存在竞争?。答案是否定的,就像你说的,汉克斯。是的,我的问题措辞会更好,因为如果只读取变量,是否存在竞争?。正如你所说,答案是否定的