Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用多个线程完成代码需要更多的时间_Multithreading_Fortran_Openmp_Benchmarking - Fatal编程技术网

Multithreading 使用多个线程完成代码需要更多的时间

Multithreading 使用多个线程完成代码需要更多的时间,multithreading,fortran,openmp,benchmarking,Multithreading,Fortran,Openmp,Benchmarking,我想用带有关键部分的OpenMP线程对一些Fortran代码进行基准测试。为了模拟一个真实的环境,我尝试在这个关键部分之前生成一些负载 !Kompileraufruf: gfortran -fopenmp -o minExample.x minExample.f90 PROGRAM minExample USE omp_lib IMPLICIT NONE INTEGER :: n_chars, real_alloc

我想用带有关键部分的OpenMP线程对一些Fortran代码进行基准测试。为了模拟一个真实的环境,我尝试在这个关键部分之前生成一些负载

!Kompileraufruf: gfortran -fopenmp -o minExample.x minExample.f90

  PROGRAM minExample
     USE omp_lib
     IMPLICIT NONE
     INTEGER                        :: n_chars, real_alloced
     INTEGER                        :: nx,ny,nz,ix,iy,iz, idx
     INTEGER                        :: nthreads, lasteinstellung,i 
     INTEGER, PARAMETER             :: dp = kind(1.0d0)
     REAL (KIND = dp)               :: j
     CHARACTER(LEN=32)              :: arg

     nx             = 2
     ny             = 2
     nz             = 2
     lasteinstellung= 10000
     CALL getarg(1, arg)
     READ(arg,*) nthreads
     CALL OMP_SET_NUM_THREADS(nthreads)
!$omp parallel
!$omp master
     nthreads=omp_get_num_threads()
!$omp end master
!$omp end parallel
     WRITE(*,*) "Running OpenMP benchmark on ",nthreads," thread(s)"

    n_chars = 0
    idx = 0
!$omp parallel do default(none) collapse(3) &
!$omp   shared(nx,ny,nz,n_chars) &
!$omp   private(ix,iy,iz, idx) &
!$omp   private(lasteinstellung,j) !&  
    DO iz=-nz,nz
       DO iy=-ny,ny
          DO ix=-nx,nx
!                  WRITE(*,*) ix,iy,iz
             j = 0.0d0
             DO i=1,lasteinstellung
                j = j + real(i)
             END DO
!$omp critical
             n_chars = n_chars + 1               
            idx = n_chars                       
!$omp end critical
          END DO
       END DO
    END DO
  END PROGRAM
我用
gfortran-fopenmp-o test.x test.f90编译了这段代码,并用
time./test.x线程执行了它
根据线程数(使用OMP_set_NUM_线程设置),执行此代码会产生一些奇怪的行为:与一个线程(6ms)相比,在我的多核机器上使用更多线程执行会花费更多的时间(2个线程:16000ms,4个线程:9000ms)。
什么会导致这种行为?有没有更好(但仍然很容易)的方法来生成负载,而不运行一些缓存效果或相关的东西


编辑:奇怪的行为:如果我在嵌套循环中进行写操作,那么使用2个线程,执行速度会显著加快。如果它被注释掉了,那么使用2个或3个线程执行会花费很长时间(write显示循环变量的增量非常缓慢)…但使用1个或4个线程则不会。我在另一台多核机器上也尝试了这段代码。这里需要1个和3个线程,但不需要2个或4个线程。

如果显示的代码确实完整,则在并行部分中缺少
加载集的定义,在并行部分中,加载集是
专用的。它是未定义和循环的

                 DO i=1,loadSet
                    j = j + real(i)
                 END DO
可以进行完全任意次数的迭代


如果之前在代码中的某个位置定义了该值,则您可能需要
firstprivate
而不是
private

如果所显示的代码确实是完整的,则在其为
private
的并行部分中缺少
loadSet
的定义。它是未定义和循环的

                 DO i=1,loadSet
                    j = j + real(i)
                 END DO
可以进行完全任意次数的迭代


如果在代码之前的某个地方定义了该值,您可能不希望使用
firstprivate
而不是
private

StackOverflow欢迎您。如果代码有问题,您应该创建一个最小的、完整的、可验证的示例。我们可以自己运行这个“其他机器”有超读功能吗。我不懂Fortran,所以我甚至没有尝试浏览代码,看看这是否是解释的一部分。欢迎来到StackOverflow。如果代码有问题,您应该创建一个最小的、完整的、可验证的示例。我们可以自己运行这个“其他机器”有超读功能吗。我不懂Fortran,所以我甚至没有尝试浏览代码,看看这是否是解释的一部分。问题是,我宣布它是私人的。谢谢定义了变量。问题是,我宣布它是私人的。谢谢