2014-05-20 100 views
3

我已經使用OpenMP編寫了一個並行程序。它使用兩個線程,因爲我的筆記本電腦是雙核心的,線程做了很多矩陣操作,所以它們是CPU綁定的。線程間沒有數據共享。程序的單個實例運行得非常快。但是當我同時運行同一程序的多個實例時,性能下降。這是一個陰謀:running time vs number of parallel instances並行程序:如何找到瓶頸(CPU綁定線程)

單個實例(兩個線程)的運行時間爲0.78秒。兩個實例(總共四個線程)的運行時間是2.06,是0.78的兩倍多。之後,運行時間與實例數(線程數)成比例地增加。

下面是其中一個實例的時間配置文件時,多個平行運行:

profile

有人能提出見解,有什麼可以怎麼回事?該配置文件顯示,OpenMP佔用了50%的時間。那是什麼意思?

+1

沒有任何代碼只能從水晶球猜測。 –

+0

您觀察到的是兩個不同進程之間的上下文切換,每個進程都使用兩個cpus上的兩個線程運行。這種縮放與您的應用程序中的瓶頸無關。 – Bort

+0

Yout通常不能說明矩陣操作是CPU綁定的。實際上很少。如果做得對,矩陣乘法是受CPU限制的(就像LU和Cholesky因式分解一樣),但其他很多不是。 –

回答

3

與@Bort所說的類似,由於您有兩個內核,因此您創建了多線程應用程序(兩個線程)。

這意味着只有一個程序實例運行時(理想情況下)它將使用整個CPU。

但是,如果應用程序的兩個實例正在運行,則沒有更多可用資源。他們每人需要兩次的時間。相同的更多的實例。

如果不增加每個實例可用的內核數(即每個實例保持2個,而不是縮小的百分比),則無法解決此問題。

+0

我認爲你的意思是「整個CPU」 – user3288829

+0

@ user3288829是的,更正了 – soandos

+0

使用taskset,我現在可以在4秒鐘內並行運行64個,而38秒(帖子內圖)。 – user1274878