我正在研究內在函數對性能的影響,我有點困惑:它們似乎沒有任何影響!我試圖用兩種不同的功能填補一系列雙打,我看不出有什麼不同。我使用對齊參數設置爲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個元素的陣列,並且我總是執行相同的執行時間。那麼......我的方法有什麼問題?爲什麼我沒有看到區別?謝謝大家。
您究竟是如何衡量執行時間? – WildCrustacean
也發佈基準代碼。 – dan3
這是C還是C++? –