2010-05-12 55 views
10

此示例code在四核處理器上將串行方法與線程方法進行了比較。該代碼僅使用GetPixel()從4張圖像中讀取所有像素。 我發現加速度大概在65%左右,爲什麼它不等於75%,因爲我有4個內核,並且它們都被充分利用了?在四核上使用線程加速代碼65%?

PS:

可以檢查代碼,因爲我沒有做任何I/O,並沒有其他進程在機器上工作(正常的Windows進程)

+2

大量的RAM被觸及,CPU將開始通過總線進行戰鬥。 – 2010-05-12 17:56:48

回答

4

它可以是任何數量的東西。一個想到的夫婦

  1. 管理不同線程的開銷。
  2. 其他進程正在同時使用系統中的資源。
+0

我確定沒有其他進程正在使用處理器 – 2010-05-12 12:50:12

+0

線程管理導致預期性能下降的可能性仍然很大。 – kemiller2002 2010-05-12 12:58:35

2

很可能它必須與某些數據結構或文件上的其他線程競爭,以免得到100%的並行執行。

例如,如果您要在四核上以4路並行方式運行網頁下載網頁類型的操作,並且服務器一次只允許同一個IP地址同時下載1次,你根本不會得到任何加速。

另外,還有一些與旋轉線程和維護它們有關的開銷,所以當你開始並行執行時,你不會得到完整核心的使用,儘管在這種情況下它很可能不是一個大的因素。

1

因爲還有其他因素需要考慮。像內存和I/O帶寬/爭用,線程上下文切換開銷等。

1
  1. 您正在操作系統中運行它。還有其他進程正在運行。這些會佔用一些CPU時間。
  2. 也許你不再受CPU限制,但受IO限制(內存帶寬,磁盤帶寬......)。
  3. 時時會出現一些開銷線程(和線程切換),編組等

總體而言,我的並行編程經驗,如果你得到的少65%流逝的時間,這是非常好。

2

線程有開銷,並不是所有東西都能並行運行。

  • 創建/啓動/停止線程的時間。
  • 完成的額外工作(如鎖定/遞增)
  • 並非每種資源都可能完全可並行化,內存訪問或讀/寫文件。
  • 操作系統和其他應用程序可能需要一些處理器時間。