我的任务是计算 RAM 读/写速度。我使用 asm 插入来避免编译器优化。为了测量时间,我使用 TSC 和 CPU 频率。为了移动数据,我使用不使用缓存层次结构的 asm 指令 MOVNTDQ。
问题在于结果。数据速率(根据数据表)为 800 Mbps,我通过测试得到 > 2000 Mbps 的写入速度。
void memory_notCache_write_128(void* src, long blocks_amount)
{
_asm
{
mov ecx, blocks_amount
mov esi, src
a20:
movntdq [esi], xmm0
movntdq [esi + 16], xmm1
movntdq [esi + 32], xmm2
movntdq [esi + 48], xmm3
movntdq [esi + 64], xmm4
movntdq [esi + 80], xmm5
movntdq [esi + 96], xmm6
movntdq [esi + 112], xmm7
add esi, 128
loop a20;
}
}
int main()
{
unsigned __int64 tick1, tick2;
const long nBytes = 32*KByte;
char* source = (char*)_mm_malloc(nBytes*sizeof(char),16);
tick1 = getTicks();
memory_notCache_write_128(source, current_times.t128);
tick2 = getTicks();
double time = (double)(tick2-tick1)/(ProcSpeedCalc());
cout << "Time WRITE_128[seconds]:" << time << endl;
cout << (double) nBytes / time / MByte << endl;
return 0;
}
我使用的 RAM 数据表 - http://www.alldatasheet.com/datasheet-pdf/pdf/308537/ELPIDA/EBE11UE6ACUA-8G-E.html
源代码(为 Win patform 编写):https ://bitbucket.org/closed_eyes/ram_speed_for_win/downloads/memory_test.cpp