2014-08-29 43 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