本项目为C++小组课程作业,旨在实现多种高性能阶乘计算算法,并利用GPU加速技术进行性能优化。项目集成了自定义FFT实现、GNU多精度运算库(GMP)以及基于CUDA的CGBN库,提供了完整的性能测试与结果验证框架。
核心特性:
- 多算法实现:支持FFT乘法、分治法、素数摇摆法等多种阶乘计算算法
- CPU优化:基于GMP的高性能CPU实现,支持OpenMP多线程并行
- GPU加速:基于CGBN库的CUDA实现,支持大规模并行计算
- 完备测试:自动化测试脚本与结果验证机制
- CPU:x86-64架构处理器,建议4核及以上
- 内存:最低8GB,建议16GB以上(计算大数阶乘时)
- GPU(可选):NVIDIA GPU,计算能力≥7.0,显存≥4GB
- 存储:至少2GB可用磁盘空间
测试平台:
- Ubuntu 22.04 LTS
- Windows Subsystem for Linux 2 (WSL2) with Ubuntu
# 克隆仓库
git clone https://gitee.com/lensit/cpp-factorial-hpc-lab.git
cd cpp-factorial-hpc-lab
# 安装依赖
make deps # 安装GMP库
make cgbn # 下载并配置CGBN库(需预先安装CUDA)
# 构建所有目标
make all
# 运行完整测试
./utilities/test.sh# 安装GMP开发库(自动检测包管理器)
make deps
# 下载CGBN库到lib/目录
make cgbn
**注意**:执行前需确保`nvcc`可用,且CUDA环境变量已正确配置# 清理特定目标(如fft_v1)
make clean_fft_v1
# 清理所有构建产物
make clean all项目默认构建所有算法实现。如需单独构建特定目标:
make fft_basic # 构建基线FFT实现
make fft_v1 # 构建优化FFT版本
make gmp_prime_swing # 构建GMP素数摇摆算法
make cgbn_improved # 构建优化CGBN版本构建目标说明:
| 目标名称 | 算法类型 | 执行环境 | 技术特点 |
|---|---|---|---|
fft_basic |
FFT乘法 | CPU | 从零实现的基线FFT算法,用于复杂度验证 |
fft_v1 |
FFT乘法 | CPU | 优化的FFT实现(缓存优化、迭代结构、并行化) |
gmp_split_recursive |
分治法 | CPU | GMP库实现的递归分割算法 |
gmp_split_recursive_thread |
分治法 | CPU | OpenMP多线程版本 |
gmp_prime_swing |
素数摇摆法 | CPU | GMP优化的素数筛法与 swing 乘积 |
gmp_mpz_fac_ui |
标准库 | CPU | GMP原生mpz_fac_ui函数基准 |
cgbn_simple |
CGBN并行 | GPU | 最小化验证版本,API功能测试 |
cgbn_full |
CGBN并行 | GPU | 完整功能CUDA实现,包含文件保存性能测试 |
cgbn_improved |
CGBN并行 | GPU | 自适应素数参数优化,动态网格配置 |
validate |
验证工具 | CPU | 结果一致性校验与数据验证 |
所有编译生成的可执行文件位于build/目录下,统一接口:
./build/<algorithm_name> <N>其中<N>为待计算阶乘的非负整数,支持的最大值取决于算法实现与系统内存。
示例:
# 计算10000的阶乘
./build/gmp_mpz_fac_ui 10000
# 计算100004000的阶乘(默认测试规模)
./build/cgbn_improved 100004000项目提供完整的测试脚本utilities/test.sh,支持批量测试与性能评估。
编辑utilities/test.sh调整测试参数:
# 默认测试规模(可修改)
DEFAULT_ARGS="100004000"
# 跳过的程序黑名单(用空格分隔)
BLACKLIST=("cgbn_simple" "validate")# 赋予执行权限(首次使用)
chmod +x ./utilities/test.sh
# 运行完整测试套件
./utilities/test.sh测试流程:
- 遍历
build/目录下所有可执行文件(排除黑名单) - 使用
DEFAULT_ARGS作为输入参数执行 - 记录执行时间、内存占用、标准输出
- 生成测试报告
test/report.txt - 自动调用
validate工具进行结果一致性验证
正确性保证:
- 所有算法实现均通过
validate程序在相对应数量级上进行交叉验证 - 验证逻辑基于要求:总位数 + 末尾0个数 + 数位之和
性能指标收集:
- 执行时间(毫秒级精度,基于
std::chrono::steady_clock)在output记录的标准输出文件中 - 峰值内存占用和运行时间(通过
/usr/bin/time -v)在statistic记录的_perf文件中
.
├── build/ # 编译输出目录(自动生成)
├── lib/ # 第三方库(CGBN、GMP)
├── reports/ # 项目总结和报告
├── src/
│ ├── FFT/ # FFT乘法实现
│ ├── GMP/ # GMP-based algorithms
│ └── CGBN/ # CUDA accelerated implementations
├── utilities/
│ └── test.sh # 自动化测试脚本
│ └── validate.cpp # 验证工具
├── Makefile # Build configuration
├── README.md # This file
└── LICENSE # Project license
问题1:./utilities/test.sh权限被拒绝
- 解决:执行
chmod +x ./utilities/test.sh
问题2:make cgbn_失败,提示nvcc: command not found
- 原因:CUDA Toolkit未安装或环境变量未配置
- 解决:确保
nvcc在PATH中,或设置CUDA_HOME环境变量
问题3:make deps在WSL2中失败
- 解决:手动安装libgmp-dev:
sudo apt-get install libgmp-dev
问题3:CGBN编译通过但运行时出现0
- 原因:计算规模超出CGBN规定
- 解决:降低输入规模,或修改CGBN参数
本项目遵循MIT License。第三方库(CGBN、GMP)受其各自许可证约束。
- 提交前请执行
make clean_all && make all确保可构建性 - 新增算法需在
makefile中添加对应编译用例 - 所有性能优化必须伴随正确性验证
文档维护:C++课程小组
最后更新:2025年12月16日