私の仕事は、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