2016-04-20 52 views
0

場景:我有一個程序,它可以是容易使用OpenMP並行化,可以說該程序的主循環是一個用於在其內循環和獨立的數據,所以它paralleizing將是微不足道的。不過目前我不要並行它,而是使用親和度調度。使用OpenMP與Affinity調度進行軟件並行化?

此程序對由在命令行參數的文件夾指定的一些輸入文件的工作。並行運行這個程序,有人可以創建一個bat文件,像這樣:

start \affinity 1 "1" bat1 
start \affinity 2 "2" bat2 
start \affinity 3 "3" bat3 
start \affinity 4 "4" bat4 

其中BAT1 - 4是與每一個bat文件不同的輸入文件夾調用main.exe一個bat文件。因此,在這種情況下,input_folder1, input_folder2, input_folder3, input_folder4上分別會運行main.exe的4個實例。

使用類似OpenMP的庫的好處是什麼,而不是親和性調度?我想

  • 使用更少的內存,單棧和堆的,而不是一個程序的n實例爲n核心
  • 更好的縮放

但我會想到竟看到一個程序實例性能提升?爲什麼如此?

+0

用戶如何不必創建一個巨大的bat文件每次必須並行運行? – NoseKnowsAll

回答

1

如果你的問題是一個簡單的平行,以在單獨的輸入文件中的數據之間沒有互動,那麼你可能不會看到使用OpenMP的加速,甚至可能會看到一個放緩,因爲內存的分配和其他各種事情必須是線程安全的。單線程進程可以獲得很多效率,實際上可以在GNU libc上進行,在POSIX線程支持下進行鏈接意味着您也可以實現較慢的執行速度malloc

+0

最後一句關於'malloc'的說法很有意思。您能否提供一些指向glibc源代碼或文檔的指針來支持它?在glibc 2.12或更新的版本中我看不到'malloc'的不同版本,儘管可以在沒有線程安全性的情況下編譯ptmalloc2。此外,該庫可以選擇爲每個核心創建一個內存競技場(幾乎)無鎖實現'malloc',並且至少啓用基於RedHat的分發。 –

+0

這是來自內存,但我的回憶是與'-lpthread'的鏈接獲得了不同的版本,或者可能構建了插入malloc的配置。 – Novelocrat