我对 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
我的最后一级缓存大约是 35MB。
有什么通讯录吗?
谢谢!
这是针对 Skylake Linux 服务器的。