0

我想从 HPCC、STREAM 和 GUPS 运行一些测试。

他们将测试内存带宽、延迟和吞吐量(在随机访问方面)。

我可以在启用内存交错的 NUMA 节点上启动单 CPU 测试 STREAM 或单 CPU GUPS 吗?(HPCC - 高性能计算挑战赛的规则是否允许?)

使用非本地内存可以增加 GUPS 的结果,因为它将增加 2 或 4 倍的内存库数量,可用于随机访问。(GUPS 通常受到非理想内存子系统和缓慢的内存库打开/关闭的限制。随着更多的银行,它可以对一个银行进行更新,而其他银行正在打开/关闭。)

谢谢。

更新:

(您也不能重新排序程序进行的内存访问)。

但是编译器可以重新排序循环嵌套吗?例如 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 回答