0

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の規則によって禁止されていますか?

4

1 に答える 1

1

私が知る限り、メモリインターリーブはコードの変更ではなくシステム設定であるため、許可されています(プログラムが行うメモリアクセスの順序を変更することはできません)。

GUPS が実際に NUMA マシン上の非ローカル メモリでより良いパフォーマンスを得るかどうかは、私には疑わしいと思われます。バンクの競合によって引き起こされるレイテンシは、実際にオフノード メモリ アクセスのレイテンシよりも大きくなるでしょうか?

STREAM はバンクの競合によって制限されるべきではありませんが、CPU にオンチップ メモリ コントローラ (Opterons など) がある場合、帯域幅がローカル メモリ コントローラと NUMA インターコネクトの間で共有されるため、おそらくオフノード アクセスの恩恵を受けるでしょう。

于 2010-03-26T10:26:56.383 に答える