簡體   English   中英

考慮CPU Boost模式的多線程超線性性能實現

[英]Multithread superlinear performance implementation with CPU boost mode consideration

我正在通過在WIN7 64位OS上使用MinGW 4.8.1 lib來研究C ++ 11中的類。

CPU是ARK | 英特爾®酷睿™i7-820QM處理器,具有四個帶8M高速緩存的物理核心,最多支持八個線程。 如果同時使用四個內核,則此CPU的基本工作頻率為1.73 GHz,如果僅使用一個內核,則可提升至3.08 GHz。

我研究的主要目標是,我將實現一個多線程測試程序,以證明隨着線程數量的增加,超線性性能也隨之提高。

這里,SUPER-linear術語表示與使用單線程相比,采用四個線程時,正好是4倍加速時間(可能是3.8倍可接受),而不是3.2倍或3.5倍。

代碼和結果粘貼在這里,

inline void count(int workNum)  // some working to do . 
                                //These codes are extracted from a real application except that the count function do some "meaningful" job and 
                                //these codes have identical speedup ratio as my real application.
{
     int s=0;  
     for(int i=0;i<workNum;++i)
       ++s;    
}

inline void devide(int numThread)  // create multiThreads [1,7] to do same amount task 
{
    int max = 100000000;
    typedef std::vector<std::thread>  threadList;
    threadList list;
    for(int i=1;i<=numThread;++i){
       list.push_back(std::thread(count,max/numThread));    
    } 
    std::for_each(list.begin(),list.end(),std::mem_fun_ref(&std::thread::join));   
}

inline void thread_efficiency_load()  // to start test 
{       
   for(int i=7;i>0;--i)
   {
     std::cout<< "*****************************************" << std::endl; 
     std::chrono::time_point<std::chrono::system_clock> start, end;
     start = std::chrono::system_clock::now();

     devide(i); // this is the work load to be measured, which i is the number of thread  

     end = std::chrono::system_clock::now();
     std::chrono::duration<double> elapsed_seconds = end-start;
     std::cout << "thread num=#" << i << "  time=" <<  elapsed_seconds.count() << std::endl;      
   }   
}   

輸出為:

 The time unit is seconds,

 *****************************************
 thread num=#7  time=0.101006
 *****************************************
 thread num=#6  time=0.0950055
 *****************************************
 thread num=#5  time=0.0910052
 *****************************************
 thread num=#4  time=0.0910052
 *****************************************
 thread num=#3  time=0.102006
 *****************************************
 thread num=#2  time=0.127007
 *****************************************
 thread num=#1  time=0.229013

這非常清楚,隨着線程數量的增加,我沒有獲得超線性性能的提升。 我想知道為什么我不明白。 為什么呢 為什么呢 為什么呢

我想到的一些基本知識

由於只有四個物理內核,因此,當有四個活動線程時,應該顯示出最大的加速比(更多線程並沒有多大幫助)。 使用四個內核的速度只有單個內核的2.4倍,而單個內核的速度有望提高4倍。 我希望上述實現能夠確實由於內存問題(高速緩存分頁)而阻止4倍的加速,因為所有變量都是局部變量。

通過考慮CPU提升模式,當只有一個內核繁忙時,CPU會將工作頻率提高到3.07 GHz,比率為1.7(內核的基本工作頻率為1.79 GHz),2.4 * 1.7大約為4,例外情況是實際上,這意味着與Boost單線程模式相比,可以實現2.4倍加速。

非常感謝您可以回答,

1)在上述實現中,在同一緩存行上是否存在一些變量,從而導致多線程之間進行大量分頁以降低性能?
2)隨着線程數的增加,如何修改上述代碼以獲得超線性性能(比單線程快4倍)?

非常感謝您的幫助。

就像前面的警告一樣:在沒有RTOS的現代x86 / x64系統上爭論多線程程序的實際性能數字總是引起很多猜測-c / c ++代碼與執行的實際操作之間存在太多層次在處理器上。

作為一個粗略的上限估算,是的,對於ALU(非內存)限制的工作負載,您獲得的加速因子不會超過1.73 * 4 / 3.08 = 2.24倍(4核4線程的速度系數與1核1線程的速度系數)即使在理想情況下。 除此之外,我認為您的測試“工作量”太小而無法獲得有意義的測試結果。 如評論中所述,編譯器將被允許用NOP操作完全替換您的工作負載函數,而只剩下創建和連接線程以及測量的開銷(盡管我認為這里沒有發生這種情況)。

暫無
暫無

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

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