2012-03-05 18 views
3

我正在嘗試使用nehalem cpu來檢測我的應用程序的性能異常,但我似乎無法達到它的單線程FP峯值性能。時鐘速度爲3.2 GHz,我希望在不使用SSE指令和多線程的情況下實現CPU的峯值FP性能。Intel Nehalem單線程峯值性能

據我所知,單精度FP加法和乘法可以在每個時鐘週期並行完成,產生2 * 3.20 = 6.4 GFLOPS/sec的最大性能。

但是我不能夠有一段簡單的代碼來達到這樣的性能:

int iterations = 1000000; 
int flops_per_iteration = 2; 
int num_flops = iterations * flops_per_iterations; 

for(int i=0; i<iterations; i++) 
{ 
    a[i] = i; 
    b[i] = i*2; 
    c[i] = i*3; 
} 

tick(&start_time); 

for(int i = 0; i < iterations; i++){ 
    a[i] *= b[i]; 
    c[i] += b[i]; 
} 

time = tock(&start_time); 

printf("Performance: %0.4f GFLOPS \n", flops/(time*pow(10,-3)*pow(10,9))); 

這段代碼給我的表現:〜而不是1.5 GFLOPS 6.4 GFLOPS。

有沒有其他的例子可以在不使用MT和SSE的情況下達到峯值性能,或者我的代碼沒有任何想法?

在此先感謝

*更新:熱循環的增加彙編代碼:*

Address Assembly 
Block 17: 
0x4013a5 movssl (%rdi,%rax,4), %xmm2 
0x4013aa movssl (%r8,%rax,4), %xmm0 
0x4013b0 movssl (%rsi,%rax,4), %xmm1 
0x4013b5 mulss %xmm2, %xmm0 
0x4013b9 addss %xmm1, %xmm2 
0x4013bd movssl %xmm0, (%r8,%rax,4) 
0x4013c3 movssl %xmm2, (%rsi,%rax,4) 
0x4013c8 inc %rax 
0x4013cb cmp %rcx, %rax 
0x4013ce jb 0x4013a5 <Block 17> 
+0

你是否嘗試過沒有數組的同樣的事情? – 2012-03-05 12:10:14

+0

什麼是您的編譯器及其選項? – osgx 2012-03-05 12:16:23

+0

我沒有嘗試沒有陣列實際上,我可以放棄它。我現在只用-O2進行編譯 – Ricky 2012-03-05 12:17:07

回答

3

要提供6.4 GFLOPS的性能,CPU應該在一個時鐘內執行10條指令。或者7條指令展開。這是不可能的。此處理器上的指令/時鐘速度不能超過4個。

+0

謝謝,這已經說明了很多。有沒有辦法用另一段代碼來達到這個最高性能? – Ricky 2012-03-05 13:03:39

+0

是的,如果您執行的運算次數多於內存讀取/寫入次數,則可以獲得更多的FLOPS。例如,'a [i] * =(b [i] * b [i]); c [i] =(a [i] + c [i] + b [i]);' – 2012-03-05 13:08:51

+1

@DanLeakin你有沒有試過看[這個問題](http://stackoverflow.com/questions/8389648/how-到實現-4-觸發器的每次循環)?經過一些調整後,OP設法讓他的代碼在每個週期1加+ 1 mul運行。 – Mysticial 2012-03-05 16:48:55

2

豪大是你的L3緩存? 4 MB?所以你可以給緩存提供一點空間。嘗試減少50%的工作量。

但是,FP操作中的「並行性」基本上意味着可以觸發FP操作,而其他操作仍在處理中而未完成。但是,你將很難使用管理使用SSE寄存器多線程技術和/或

  • 獲得真正的並行無任何

  • +0

    L3緩存爲8 MB。我試圖減少問題的大小,但這並不能真正提高性能 – Ricky 2012-03-05 12:21:15

    +0

    在這種情況下,我並不想真正利用並行性,我只想理解爲什麼我無法使用FP來達到FP操作的理論峯值性能單線程和無sse指令。感謝您的反應! – Ricky 2012-03-05 12:22:47

    +0

    您可以發佈您的(優化)機器指令的熱循環?它不僅包含*和+。此外,寄存器的加載和數據的移動。它們也引入成本。 – 2012-03-05 12:30:00

    2

    你不使用循環展開填滿CPU管道?

    +0

    我試過這個使用'#pragma unroll(x)'爲x的幾個值,但是這隻會提高性能有點 – Ricky 2012-03-05 12:51:37

    +0

    哪個值的x? – 2012-03-05 13:21:28

    +0

    我嘗試了2的倍數從2到1024 – Ricky 2012-03-05 13:32:18