gpt4 book ai didi

linux - OpenMP 和并行化问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:14 27 4
gpt4 key购买 nike

我正在使用 super 计算机进行计算电磁学实验室的研究。在这里,我们正在使用集群来解决包含超过 5 亿个未知数的问题。在这一点上,我们遇到了并行化所有这些计算的问题。到目前为止,我们一直在使用 MPI 在节点之间进行通信,但是,考虑到 OpenMP 的优势,我们即将决定使用 OpenMP 来实现节点中处理器之间的通信。尽管如此,我们无法从 openMP 中获得任何效率(可能是因为错误的编码)。实际上关键是我不知道我将给出的代码有什么问题。

在没有任何 OpenMP 指令的情况下,顺序纯代码花费了相同的时间。当我使用“top”命令时,8 个处理器在并行部分以 %100 的性能工作。

gfortran --版本 | head -1 GNU Fortran (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)

PROGRAM dotproduct
USE omp_lib
IMPLICIT none

INTEGER ::h,m,i,TID,NTHREADS,j,ierr

REAL :: start,end
REAL, ALLOCATABLE, DIMENSION(:,:) :: a
REAL, ALLOCATABLE, DIMENSION(:) :: x
REAL, ALLOCATABLE, DIMENSION(:) :: b

m= 20000
OPEN(UNIT=1,FILE='matrix20000.dat',STATUS='UNKNOWN')
OPEN(UNIT=2,FILE='vector20000.dat',STATUS='UNKNOWN')

ALLOCATE(a(m,m))
ALLOCATE(x(m))
ALLOCATE(b(m))
REWIND(1)
REWIND(2)

WRITE(*,*) ' Reading is just started'

READ(1,*), a(:,:)
READ(2,*), x(:)

WRITE(*,*) ' Reading is over'
WRITE(*,*) ' Calculating will be started after parallelization'

!$OMP PARALLEL PRIVATE(i,TID,j),SHARED(NTHREADS,m,a,x,b)
TID= omp_get_thread_num()
IF(TID == 0) THEN
NTHREADS = OMP_GET_NUM_THREADS()
PRINT*, 'Starting matrix multiple example with', NTHREADS
END IF
CALL cpu_time(start)
!$OMP DO
DO i=1, m
b(i)= 0
DO j=1, m
b(i) = b(i)+ a(i,j)*x(j)
END DO
END DO
!$OMP END DO
!$OMP END PARALLEL
CALL cpu_time(end)

WRITE(*,*) end-start,' seconds'

!DO i=1,m
! WRITE(*,*) b(i)
!END DO

DEALLOCATE(a) !----Deallocation
DEALLOCATE(x)
DEALLOCATE(b)


END PROGRAM dotproduct

最佳答案

经典错误 - Cpu_time 通常测量总 CPU 时间,这意味着它是所有线程的总和!因此,无论线程数量如何,完美的加速都会导致恒定的时间

尝试使用 system_clock 或类似工具测量挂钟时间,看看会得到什么。

顺便说一句 - 为什么 nthreads 是共享的?最好尽可能保持私密性

(对不起,如果这出现两次,第一次努力...)

关于linux - OpenMP 和并行化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7379183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com