簡體   English   中英

C ++中的CPU速度和線程

[英]CPU speed and threads in C++

我有以下C ++程序:

void testSpeed(int start, int end)
{
    int temp = 0;
    for(int i = start; i < end; i++)
    {
        temp++;
    }
}  

int main() {

    using namespace boost;

    timer aTimer;

    // start two new threads that calls the "testSpeed" function

    boost::thread my_thread1(&testSpeed,         0,  500000000);
    boost::thread my_thread2(&testSpeed, 500000000, 1000000000);

    // wait for both threads to finish
    my_thread1.join();
    my_thread2.join();

    double elapsedSec =  aTimer.elapsed();
    double IOPS = 1/elapsedSec;
}

因此,我們的想法是以每秒整數運算(IOPS)來測試CPU速度。 有10億次迭代(操作),所以在1Ghz CPU上我們應該每秒進行大約十億次整數運算,我相信。

我的假設是更多的線程=每秒更多的整數運算。 但是我嘗試的線程越多,我看到的每秒操作越少(我的內核多於線程)。 什么可能導致這樣的行為? 這是線程開銷嗎? 也許我應該嘗試更長的實驗,看看線程是否真的有用?

謝謝!

更新 :所以我將循環更改為運行了18億次,並將temp聲明為volatile。 還添加了另一個具有不同名稱的testSpeed方法,所以現在一個線程一個接一個地執行這兩個方法,而兩個線程獲得每個方法; 所以不應該有任何同步'問題等等......並且......行為仍然沒有變化! 根據計時器,單線程更快。 唉唉! 我找到了傻瓜,顯然計時器是虛張聲勢。 這兩個線程花費了一半的時間來完成但是計時器告訴我單線程運行速度快了兩秒。 我現在正在努力理解為什么......謝謝大家!

我幾乎可以肯定編譯器會優化你的循環。 由於您沒有減去創建/同步線程的開銷,因此實際上只測量它。 因此,您擁有的線程越多,創建的開銷就越多,所需的時間也就越多。

總的來說,您可以參考CPU的文檔,了解它的頻率以及任何給定指令需要多少滴答。 使用這樣的方法自己測試幾乎是不可能的,而且是無用的。 這是因為像上下文切換這樣的開銷,將執行從一個CPU /核心轉移到另一個CPU /核心,調度程序交換,分支錯誤預測。 在現實生活中,您還會遇到緩存未命中和大量內存總線延遲,因為沒有適合~15個寄存器的程序。 因此,您最好使用一些優秀的分析器來測試真實的程序。 例如,最新的CPU可以發出CPU停頓信息,緩存未命中,分支錯誤預測等等。 你可以使用一個好的分析器來實際決定何時以及如何並行你的程序。

隨着線程數增加超過某一點,它會導致緩存未命中數增加(緩存在線程之間共享),但同時內存訪問延遲被大量線程掩蓋(當一個線程正在等待從內存中提取數據時,其他線程正在運行)。 因此有一個權衡。 是一篇關於這個主題的非常有趣的論文。

根據這篇論文,在一個多核機器上,當線程數量非常低(核心數量級)時,性能會隨着線程數量的增加而增加,因為現在核心正在被充分利用。

在此之后,線程數量的進一步增加導致高速緩存未命中的影響,從而導致性能下降。

如果線程數變得非常大,使得每個線程的高速緩存存儲量幾乎變為幾乎為零,則所有存儲器訪問都是從主存儲器進行的。 但同時增加的線程數也非常有效地掩蓋了增加的內存訪問延遲。 這次第二種效應占主導地位,導致性能提升。

因此,中間的山谷是性能最差的地區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM