我想从 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的规则是否禁止这种优化?