Я хочу запустить несколько тестов из HPCC, STREAM и GUPS.
Они будут тестировать пропускную способность памяти, задержку и пропускную способность (в терминах случайного доступа).
Могу ли я запустить однопроцессорный тест STREAM или однопроцессорный GUPS на узле NUMA с включенным чередованием памяти? (Разрешено ли по правилам HPCC - High Performance Computing Challenge?)
Использование нелокальной памяти может увеличить результаты GUPS, потому что это увеличит в 2 или 4 раза количество банков памяти, доступных для случайного доступа. (GUPS обычно ограничен неидеальной подсистемой памяти и медленным открытием / закрытием банка памяти. При большем количестве банков он может выполнять обновление до одного банка, в то время как другие банки открываются / закрываются.)
Спасибо.
UPDATE:
(вы не можете ни изменять порядок обращений к памяти, которые делает программа).
Но может ли компилятор переупорядочивать циклы вложенности? Например. 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++) {
. Используя оптимизацию 'loop interchange', компилятор может преобразовать этот код в
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?