C. Flash Ticker¶
分数:100 分
背景¶
在分秒必争的高频交易领域,系统的响应速度直接决定了盈亏。我们的核心交易引擎在最新的鲲鹏服务器上部署后,发现了一个令人困惑的现象:虽然我们为每个交易对分配了独立的计算核心,理论上应当实现完美的线性加速,但实际吞吐量却远低于预期,甚至不如少用几个核心时的表现。
作为团队的首席性能架构师,你需要深入底层,找出阻碍性能释放的元凶,并对关键数据结构进行重构,让这台多核怪兽展现出它在这个并行任务上应有的爆发力。
任务描述¶
程序包含两个文件:
main.cpp:负责启动 16 个 OpenMP 线程,生成随机模拟行情,并统计最终结果。market.h:定义了核心数据结构Candle和MarketData。
你需要修改 market.h 中的结构体定义,以提升程序在多核环境下的运行效率。
修改限制:允许调整结构体的定义方式、内存布局等;禁止修改成员变量的名称(如 high,vol等),禁止修改变量类型及其精度(必须保持double/long long)。
请提交修改后的 market.h 文件。
输入输出¶
输入 format¶
程序从标准输入读取数据:
N (long long): 每个线程模拟的 Tick 数。Seed (int): 随机种子。
输出 format¶
程序向标准输出打印结果:
- 第一行:所有合约的总成交额,即 \sum Price \times Volume。
- 第二行:所有合约的 VWAP (成交量加权平均价),计算方式为 Total Turnover / Total Volume 。
样例输入¶
50000000 123
样例输出¶
769984094225.13
174.9963
运行环境、编译与测试¶
本题将在 Huawei Kunpeng 920A (ARM64, 64-Core) 的 16 个核心上运行。评测容器镜像:cr.hpc.lcpu.dev/hpcgame/3rd-kunpeng920:latest,基础发行版为Fedora 43,安装了clang 21,flang 21和gcc 15 。
可以使用以下命令编译程序:
g++ main.cpp -o main -O3 -fopenmp -std=c++17 -march=native
我们会使用如下命令运行程序:
export OMP_NUM_THREADS=16
export OMP_PLACES=cores
export OMP_PROC_BIND=close
./main < input.txt > output.txt
评分标准¶
- 正确性:输出结果必须与标准答案的相对误差不超过
1e-12。 - 性能:程序运行时间为
t,满分时间为t_0则得分为min(20, 20^(t_0/t))。
共 5 个测试点,迭代次数有所不同。满分标准:
| 迭代次数 | 满分时间 | 最长运行时间 | 分值 |
|---|---|---|---|
| 5e7 | 0.35s | 0.7s | 20 |
| 5e8 | 3.5s | 7.0s | 20 |
| 1e9 | 7.0s | 14.0s | 20 |
| 5e9 | 35.0s | 70.0s | 20 |
| 5e10 | 349.0s | 698.0s | 20 |
Hint¶
- 鲲鹏 CPU 有自己的硬件特质,了解这些特质有助于优化性能。