2013-03-12 63 views
1

當使用超線程(例如花費在自旋鎖或緩存未命中的時間)時,CPU時間是否增加(由time CLI命令報告),或者是否有可能由於HT的奇特性而使CPU時間膨脹? (例如,真正的核心忙,HT不能踢)CPU時間與超線程相關嗎?

我有四核i7,我正在測試一個OpenMP program trivially-parallelizable部分(圖像調色板重新映射) - 沒有鎖,沒有關鍵部分。所有的線程訪問一些只讀的共享內存(查找表),但只寫入他們自己的內存。

cores real CPU 
    1: 5.8 5.8 
    2: 3.7 5.9 
    3: 3.1 6.1 
    4: 2.9 6.8 
    5: 2.8 7.6 
    6: 2.7 8.2 
    7: 2.6 9.0 
    8: 2.5 9.7 

我擔心用迅速增加的內核數量超過了CPU時間量1或2

我想,理想情況下CPU的時間不會增加太多(的量相同工作只是分佈在多個核心上)。

這是否意味着有40%的開銷花在並行化程序上?

+0

不要忘記超線程內核不是「真正的」內核。所以預計CPU時間會增加。 – Mysticial 2013-03-12 00:56:50

+1

我會更擔心的是CPU時間**沒有快速增加,表明內核處於空閒狀態。在理想的情況下,CPU時間將是'真實'的核心時間(在HT開始之前,'核心'高達'4')。已經有3個核心,效率下降到65%。參見[Amdahl's law](http://en.wikipedia.org/wiki/Amdahl%27s_law),瞭解程序中非平行部分的數量如何影響其可伸縮性。還要探究問題是否是內存限制。 – 2013-03-12 07:04:27

+0

也可能你編寫了「平行並行」的部分。並行計算錯誤並最終導致性能浪費非常容易,從而導致不理想的擴展。但是,40%聽起來很荒謬 - 我很容易用較少的可擴展算法獲得95%的效率,所以這裏肯定有一些東西在玩。 – Thomas 2013-03-14 06:55:04

回答

1

這很可能是測量CPU時間的一個假象。一個簡單的例子是,如果你運行一個100 MHz的CPU和一個3 GHz的CPU每秒一秒,每個都會報告它跑了一秒鐘。第二個CPU可能會做30倍的工作,但需要一秒鐘的時間。使用超線程技術,一個合理的(不是很準確的)模型就是一個內核可以運行任意一個任務,比如說2000 MHz,或者兩個任務可以說1200 MHz。運行兩項任務,每個線程只能完成60%的工作,但兩項線程的工作量只有120%,提高了20%。但是如果操作系統詢問CPU使用了多少秒時間,則第一個會在每秒鐘後實時報告「1秒」,而第二個會報告「2秒」。

因此報告的CPU時間增加。如果它少於雙打,整體表現會提高。

1

快速問題 - 你運行的是真正的時間程序/ usr/bin/time還是內置的同名bash命令?我不確定這件事,他們看起來非常相似。

看着你的數字表格,我感覺到處理過的數據集合(即輸入加上所有輸出數據)總體上相當大(比L2高速緩存大),並且每個數據項目的處理都不那麼冗長。

這些數字顯示從1核心到2核心幾乎呈線性改善,但是在使用4核心時顯着拖尾。 hyhrthreaded核心幾乎沒有增加。這意味着共享的東西正在被爭奪。你的程序有自由運行的線程,所以這個東西只能是內存(三級緩存和i7上的主內存)。

這聽起來像是被I/O綁定而不是計算綁定的一個典型例子,在這種情況下,I/O與L3緩存和主內存相關。二級緩存是256k,所以我猜測你的輸入數據加上一組結果和所有中間數組的大小都大於256k。

我靠近標記嗎?

一般來說,在考慮使用多少線程時,必須考慮共享高速緩存和內存速度以及數據集大小。這可能是一個正確的錯誤,因爲你必須在運行時解決這個問題,這是很多編程工作(除非你的硬件配置是固定的)。

+0

'/ usr/bin/time'是一樣的。我喜歡這個概念,但我不知道我在哪裏/是否達到了極限。 [重新映射](https://github.com/pornel/improved-pngquant/blob/lib/lib/libimagequant.c#L660)使用查找表(精確鋸齒的數組),大小約爲20KB。整個圖像的大小可以是MB,但是可以線性訪問('* dest ++ = lookup(* srC++)')。你能推薦可以檢測爭用的技術/工具嗎? – Kornel 2013-03-14 15:58:34

+0

英特爾的VTune我認爲可以告訴你很多關於你的程序內部發生了什麼(雖然花錢)。不過,我認爲你已經回答了「整個圖像可能是MB大小」。這對L2緩存來說太大了。你每次都在小塊上操作?那麼,即使每個塊都適合L2,那麼緩存仍然需要將結果刷新到L3,以便爲新結果塊騰出空間。由於所有4個L2高速緩存試圖一次性完成,L3成爲瓶頸。如果你溢出L3,那麼它返回到主內存。 – bazza 2013-03-14 17:36:36

+0

如果您可以在每個塊處於L2/L1緩存時考慮更多事情,則可以改善這種情況。也就是說,如果在重新映射之後,你對圖像做了一些其他計算,那麼在重新映射該塊之後,可能會立即在塊上完成這些元素。這會將平衡從I/O限制(您目前的狀況)轉回到計算範圍。 – bazza 2013-03-14 17:50:27