![](/img/trans.png)
[英]C++ Boost Multithread is slower than single thread because of CPU type?
[英]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.