跳转至

C. Flash Ticker

分数:100 分

背景

在分秒必争的高频交易领域,系统的响应速度直接决定了盈亏。我们的核心交易引擎在最新的鲲鹏服务器上部署后,发现了一个令人困惑的现象:虽然我们为每个交易对分配了独立的计算核心,理论上应当实现完美的线性加速,但实际吞吐量却远低于预期,甚至不如少用几个核心时的表现。

作为团队的首席性能架构师,你需要深入底层,找出阻碍性能释放的元凶,并对关键数据结构进行重构,让这台多核怪兽展现出它在这个并行任务上应有的爆发力。

任务描述

程序包含两个文件:

  1. main.cpp:负责启动 16 个 OpenMP 线程,生成随机模拟行情,并统计最终结果。
  2. market.h:定义了核心数据结构CandleMarketData

你需要修改 market.h 中的结构体定义,以提升程序在多核环境下的运行效率。

修改限制:允许调整结构体的定义方式、内存布局等;禁止修改成员变量的名称(如 high,vol等),禁止修改变量类型及其精度(必须保持double/long long)。

请提交修改后的 market.h 文件。

输入输出

输入 format

程序从标准输入读取数据:

  1. N (long long): 每个线程模拟的 Tick 数。
  2. Seed (int): 随机种子。

输出 format

程序向标准输出打印结果:

  1. 第一行:所有合约的总成交额,即 \sum Price \times Volume
  2. 第二行:所有合约的 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 21gcc 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

评分标准

  1. 正确性:输出结果必须与标准答案的相对误差不超过 1e-12
  2. 性能:程序运行时间为 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 有自己的硬件特质,了解这些特质有助于优化性能。

附件