2014-08-29 42 views
-1

我有如下使用OpenMP问题描述:编程问题使用OpenMP

我有这样

subroutine ... 
    ... 
    do i=1,N 
    .... 
    end do 
end subroutine ... 

和OpenMP代码的串行代码是

subroutine ... 
    use omp_lib 
    ... 
    call omp_set_num_threads(omp_get_num_procs()) 
    !$omp parallel do 
    do i=1,N 
    .... 
    end do 
    !$omp end parallel do 
end subroutine ... 

没有问题与编译,但是当我运行该程序时,有两个主要问题与串行代码的结果相比:

  1. 该程序的运行速度比串行代码还要慢(假设在do循环中执行矩阵乘法(matmul))
  2. 与串行代码相比,数字精度似乎有所下降(我对它进行了检查)

任何想法可能会发生什么?
谢谢,
小玉

+0

[Fortran的并行程序设计(可能重复http://stackoverflow.com/questions/25465101/fortran-parallel-programming) – 2014-08-29 20:09:51

+2

或者甚至更好:https://stackoverflow.com/questions/6878246/fortran-intrinsic-timing-routines-which-is-better-cpu-time-or-system-clock – 2014-08-29 20:11:10

回答

1

在使用OpenMP并行的情况下,你需要指定线程程序是使用数量。您可以通过使用环境变量OMP_NUM_THREADS(例如,通过拨打您的程序

OMP_NUM_THREADS=5 ./myprogram 

使用5个线程执行它。

或者,您可以设置运行时的线程数omp_set_num_threadsdocumentation)。

旁注

  1. 不要忘记设置私有变量,如果在循环中有什么!
    实施例:

    $ OMP平行做私人(prelimRes)
    做I = 1,N
    prelimRes = myFunction的(ⅰ)
    RES(ⅰ)= prelimRes + someValue中
    端做
    !$ OMP到底并行做

    注变量如何prelimRes声明private让每个线程都有自己的workspac即

  2. 根据循环内的实际情况(即使用OpenBLAS),由于不同的相似处理,您的结果可能确实有所不同(变化应该小于1e-8关于双精度变量)。

  3. 如果您不确定发生了什么,则应在程序运行时使用htop或类似程序检查CPU负载。

附录:设置线程数,以自动匹配的CPU 的数量如果您想使用有用的最大线程数,例如使用尽可能多的线程,因为有CPU的,你可以这样做,通过使用(就像你在你的问题说):

subroutine ... 
    use omp_lib 
    ... 
    call omp_set_num_threads(omp_get_num_procs()) 
    !$omp parallel do 
    do i=1,N 
     .... 
    end do 
    !$omp end do 
    !$omp end parallel 
end subroutine ... 
+0

@Rain这确实是可能的。你应该注意'omp_get_num_procs()'的结果。 Afaik,如果你想获得可靠的结果,你只能在omp环境中使用这个命令。 – fuesika 2014-08-29 18:40:31

+0

@Rain如果我正确理解你,你已经设置了进程的数量(但它似乎没有工作)?你有没有在我的帖子中查看其他两个提示? – fuesika 2014-08-29 18:43:20

+0

我在主要上下文中设置了修改的进程数量,并检查程序运行时系统监视器显示程序正在使用4个线程 – Rain 2014-08-29 18:45:09