2012-12-30 34 views
-5

我正在研究內在函數對性能的影響,我有點困惑:它們似乎沒有任何影響!我試圖用兩種不同的功能填補一系列雙打,我看不出有什麼不同。我使用對齊參數設置爲8的_aligned_malloc調用來分配數組。我使用Visual Studio 2008和我在Release模式下編譯,無論是否使用優化(/ O2 -/Od)以及使用和不使用內部函數(/ Oi) - 所有四種組合。兩個不同的版本如下:填充/無內在函數C++

#ifdef _NO_INTRIN 

void my_fill(double* vett, double value, int N) 
{ 
    double* last = vett + N; 
    while(vett != last) 
    { 
     *vett++ = value; 
    } 
} 

#else 

void my_fill(double* vett, double value, int N) 
{ 
    double* last = vett + N; 

    // set "classically" unaligned data, if any 
    while((0xF & (uintptr_t)vett) && vett != last) 
     *vett++ = value; 

    __m128d* vett_ = (__m128d*)vett; 
    uintptr_t fff0 = ~0 << 4; 
    // round address to nearest aligned data setting to zero least significant 4 bits 
    __m128d* last_ = (__m128d*)(fff0 & (uintptr_t)last); 
    // process until second-last element to manage odd values of N 
    for(; vett_ < last_-1; vett_++) 
    { 
     *vett_ = _mm_set1_pd(value); 
    } 

    vett = (double*)vett_; 
    while(vett != last) 
     *vett++ = value; 
}  

#endif 

作爲最後的規範,我對準我的數據,8B,而不是16,因爲我打算在該陣列的不同部分多線程的方式來執行此功能。因此,也將數據對齊到16B我不能確定數組的所有部分將對齊(例如303個元素,3個線程,每個線程101個元素,第一個部分對齊到16B,第二個部分從@ vett + 101開始* 8 ==>未對齊)。這就是爲什麼我試圖實現一個對齊不可知的功能。 我試圖在我的Intel Atom CPU N570 @ 1.66 GHz上填充1M個元素的陣列,並且我總是執行相同的執行時間。那麼......我的方法有什麼問題?爲什麼我沒有看到區別?謝謝大家。

+1

您究竟是如何衡量執行時間? – WildCrustacean

+0

也發佈基準代碼。 – dan3

+1

這是C還是C++? –

回答

0

如果您沒有進行任何複雜的計算,並且您純粹將固定值寫入內存,則您的程序速度可能會受到內存帶寬的限制。 CPU可以以更快的速度在內部產生這些值,但它受限於它可以將它們傳送到RAM中的速率(特別是在處理不適合CPU高速緩存的大內存區時)。