# streamOpt **Repository Path**: mapkkk/stream-opt ## Basic Information - **Project Name**: streamOpt - **Description**: stream内存带宽测试针对现代CPU大LLC的优化版本 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-04 - **Last Updated**: 2026-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # STREAM 本地使用说明 本仓库修改自`http://www.cs.virginia.edu/stream/FTP/Code/stream.c`, 是为了解决现代CPU的LLC使得静态数组过大导致出现链接阶段的大 BSS/重定位错误。 本目录包含基准源码与两个辅助脚本: - `stream.c`:STREAM 基准主程序 - `compile.sh`:编译脚本(默认 OpenMP) - `run.sh`:运行脚本(默认使用物理核心数) ## 1. 环境要求 - Linux - GCC(建议 9+) - OpenMP(GCC 自带 `-fopenmp` 支持) 快速检查: ```bash gcc --version ``` ## 2. 代码改动说明(与原始 STREAM 的区别) 为支持超大数组(例如每个数组 1 GiB 以上),`stream.c` 已将原来的静态全局数组改为运行时动态分配。 这样可以避免在大 `STREAM_ARRAY_SIZE` 下出现链接阶段的大 BSS/重定位错误。 ## 3. 编译 ### 3.1 默认编译 ```bash ./compile.sh ``` 当前默认行为: - 使用 OpenMP(`-fopenmp`) - 默认数组大小:`N=40000000` - 默认迭代次数:`NTIMES=10` - 输出文件:`stream` 等价命令风格示例: ```bash gcc -O3 -fopenmp -DN=40000000 -DSTREAM_ARRAY_SIZE=40000000 -DNTIMES=10 stream.c -o stream -lm ``` ### 3.2 可选模式 ```bash ./compile.sh serial # 不加 -fopenmp ./compile.sh omp my_stream # OpenMP 模式并指定输出名 ``` ### 3.3 通过环境变量覆盖参数 `compile.sh` 头部变量可直接改,也可在命令行覆盖: - `CC`:编译器(默认 `gcc`) - `SRC`:源码文件(默认 `stream.c`) - `OUT_DEFAULT`:默认输出名(默认 `stream`) - `BASE_CFLAGS`:基础编译优化参数(默认 `-O3`) - `USE_OPENMP_DEFAULT`:OpenMP 开关(默认 `1`) - `N`:数组元素个数(默认 `40000000`) - `NTIMES`:迭代次数(默认 `10`) - `EXTRA_DEFINES`:额外宏定义 示例: ```bash N=160000000 NTIMES=20 ./compile.sh BASE_CFLAGS="-O3 -march=native" ./compile.sh EXTRA_DEFINES="-DOFFSET=56" ./compile.sh ``` ## 4. 运行 ### 4.1 默认运行 ```bash ./run.sh ``` 运行脚本行为: - 自动选择可执行文件(优先 `./stream_omp`,其次 `./stream`) - 自动检测物理核心数(优先读取 `/proc/cpuinfo` 的 `physical id + core id` 去重) - 默认将 `OMP_NUM_THREADS` 设为物理核心数(避免跑在超线程上) ### 4.2 手动指定 ```bash ./run.sh stream 8 OMP_NUM_THREADS=16 ./run.sh stream ``` ## 5. 如何选择 N(大 LLC 服务器建议) STREAM 的经验规则:每个数组至少应达到 LLC 的约 4 倍。 若使用双精度(8 字节),每个数组大小约为: - 每数组字节数 = `8 * N` - 三数组总内存约 = `24 * N` 例如: - 目标每数组 1.2 GiB:`N ≈ 1.2 * 1024^3 / 8 ≈ 161061274` 可直接这样编译: ```bash N=161061274 ./compile.sh ``` ## 6. 结果是否可信的快速判断 运行输出中重点看: - `Number of Threads requested` 与 `counted` 是否一致 - `clock ticks` 是否明显大于 20(越高越稳) - 最后是否出现 `Solution Validates` ## 7. 常见问题 ### 7.1 大数组时链接报错 原因通常是静态大数组导致链接器处理超大 BSS/重定位失败。 本版本已改为动态分配,通常可直接解决。 ### 7.2 运行时报内存不足 说明 `N` 过大,超过系统可用内存。请降低 `N`,或在更大内存节点运行。