我有几个关于 STREAM 基准测试(http://www.cs.virginia.edu/stream/ref.html#runrules)的问题。
- 下面是 stream.c 中的注释。为什么要求数组的大小应该是缓存大小的四倍?
* (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
这里设置了编译标志,包括启用OpenMP支持、数组大小等。
我的最后一级缓存大小约为35MB。
有任何意见吗?
谢谢!
这是针对一台Skylake Linux服务器的。