У меня есть несколько вопросов по STREAM (http://www.cs.virginia.edu/stream/ref.html#runrules).
- Ниже комментарий от stream.c. Каково обоснование требования, чтобы массивы были в 4 раза больше размера кеша?
* (a) Each array must be at least 4 times the size of the
* available cache memory. I don't worry about the difference
* between 10^6 and 2^20, so in practice the minimum array size
* is about 3.8 times the cache size.
- Первоначально я предполагал, что STREAM измеряет пиковую пропускную способность памяти. Но позже я обнаружил, что, добавляя дополнительные массивы и доступ к массивам, я могу получить более высокие значения пропускной способности. Так что мне кажется, что STREAM не гарантирует насыщения пропускной способности памяти. Тогда мой вопрос: что на самом деле измеряет STREAM и как вы используете цифры, сообщаемые STREAM?
Например, я добавил два дополнительных массива и обратился к ним вместе с исходными массивами a/b/c. Я изменяю учет байтов соответственно. Благодаря этим двум дополнительным массивам пропускная способность увеличилась примерно на 11,5%.
> diff stream.c modified_stream.c
181c181,183
< c[STREAM_ARRAY_SIZE+OFFSET];
---
> c[STREAM_ARRAY_SIZE+OFFSET],
> e[STREAM_ARRAY_SIZE+OFFSET],
> d[STREAM_ARRAY_SIZE+OFFSET];
192,193c194,195
< 3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
< 3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE
---
> 5 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
> 5 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE
270a273,274
> d[j] = 3.0;
> e[j] = 3.0;
335c339
< c[j] = a[j]+b[j];
---
> c[j] = a[j]+b[j]+d[j]+e[j];
345c349
< a[j] = b[j]+scalar*c[j];
---
> a[j] = b[j]+scalar*c[j] + d[j]+e[j];
CFLAGS = -O2 -fopenmp -D_OPENMP -DSTREAM_ARRAY_SIZE=50000000
Мой кеш последнего уровня составляет около 35 МБ.
Любой комментарий?
Спасибо!
Это для сервера Skylake Linux.