HPCC、STREAM、GUPSからいくつかのテストを実行したいと思います。
彼らは、メモリ帯域幅、遅延、およびスループット(ランダムアクセスの観点から)をテストします。
メモリインターリーブが有効になっているNUMAノードでシングルCPUテストSTREAMまたはシングルCPUGUPSを開始できますか?(HPCC-ハイパフォーマンスコンピューティングチャレンジのルールで許可されていますか?)
非ローカルメモリを使用すると、ランダムアクセスに使用できるメモリバンクの数が2倍または4倍になるため、GUPSの結果が増える可能性があります。(GUPSは通常、非理想的なメモリサブシステムと遅いメモリバンクの開閉によって制限されます。バンクが増えると、他のバンクが開閉している間に1つのバンクに更新できます。)
ありがとう。
アップデート:
(プログラムが行うメモリアクセスを並べ替えることはできません)。
しかし、コンパイラーはループのネストを並べ替えることができますか?例:hpcc / RandomAccess.c
/* Perform updates to main table. The scalar equivalent is:
*
* u64Int ran;
* ran = 1;
* for (i=0; i<NUPDATE; i++) {
* ran = (ran << 1) ^ (((s64Int) ran < 0) ? POLY : 0);
* table[ran & (TableSize-1)] ^= stable[ran >> (64-LSTSIZE)];
* }
*/
for (j=0; j<128; j++)
ran[j] = starts ((NUPDATE/128) * j);
for (i=0; i<NUPDATE/128; i++) {
/* #pragma ivdep */
for (j=0; j<128; j++) {
ran[j] = (ran[j] << 1) ^ ((s64Int) ran[j] < 0 ? POLY : 0);
Table[ran[j] & (TableSize-1)] ^= stable[ran[j] >> (64-LSTSIZE)];
}
}
ここでのメインループはでfor (i=0; i<NUPDATE/128; i++) {
あり、ネストされたループはfor (j=0; j<128; j++) {
です。「ループ交換」最適化を使用して、コンパイラはこのコードをに変換できます
for (j=0; j<128; j++) {
for (i=0; i<NUPDATE/128; i++) {
ran[j] = (ran[j] << 1) ^ ((s64Int) ran[j] < 0 ? POLY : 0);
Table[ran[j] & (TableSize-1)] ^= stable[ran[j] >> (64-LSTSIZE)];
}
}
このループネストは完璧なループネストであるため、これを行うことができます。そのような最適化はHPCCの規則によって禁止されていますか?