一个支持分布式(按连续行块划分)与对称存储扩展的 C++17 CSR 稀疏矩阵库,集成 MPI(可选)、OpenMP(可选)、GoogleTest 单元测试与 MUMPS 导出适配。
核心设计:模板化多标量类型支持 —— 库已完全模板化,四种标量类型(float、double、std::complex<float>、std::complex<double>)可在同一次编译中同时使用,无需切换编译开关重新构建。提供远程条目通信装配与对称矩阵的上下三角展开。
当前构建为静态库
csr4mpi+ 测试可执行csr4mpi_tests。
项目完全使用 Github Copilot 开发,用时 3 小时左右。
- 模板化多标量类型:所有核心类均为 C++ 模板,支持
float、double、std::complex<float>、std::complex<double>四种标量类型,无需重新编译即可同时使用。 - 便利类型别名:提供
cCSRMatrixF、cCSRMatrixD、cCSRMatrixCF、cCSRMatrixCD等预定义别名,简化常用类型的声明。 - 类型特征工具:
is_complex_v<T>、is_supported_scalar_v<T>、real_type_t<T>等编译期类型检测和转换工具。 - 连续行块分布:
cRowDistribution描述全局行到进程的映射。 - 本地 CSR 结构:
cCSRMatrix<Scalar>保存所属行区间的行指针、列索引与数值。 - 通信模式:
cCommPattern<Scalar>聚合跨进程目标条目 (globalRow, globalCol, value)。 - 汇总装配:
cCSRComm<Scalar>::Assemble使用 MPI Alltoallv 交换并累加远程重复条目。 - 对称存储展开:支持下三角存储在 SpMV/SpMM 中自动补全镜像贡献(本地 + 远程)。
- MUMPS 导出:
cMumpsAdapter<Scalar>输出 1-based COO 三元组。 - Benchmark:
csr4mpi_bench_spmv输出平均耗时与 GFLOPs。
推荐在独立目录:
mkdir build
cd build
cmake -G "Ninja" ..
cmake --build . --config Release参数说明:
-DCSR4MPI_ENABLE_OPENMP=ON|OFF:控制并行内核的 OpenMP 支持。- 无需指定标量类型参数 —— 四种标量类型在同一次编译中均可使用。
提供脚本 scripts/download_matrices.sh(依赖 bash + curl + tar):
bash scripts/download_matrices.sh将尝试下载:
bcsstk13.mtx(Boeing group) – 中等规模结构矩阵add32.mtx(HB group) – 较小测试矩阵
文件放置到 tests/data/。若访问失败请手动前往 https://sparse.tamu.edu/ 对应页面下载 tar.gz 后解压并将 .mtx 文件置于该目录。
也支持通过 scripts/matrices.txt 指定自定义下载清单(每行一个 .tar.gz 完整 URL;忽略以 # 开头的行):
echo "https://your-storage/MM/Boeing/bcsstk13.tar.gz" >> scripts/matrices.txt
echo "https://your-storage/MM/HB/add32.tar.gz" >> scripts/matrices.txt
bash scripts/download_matrices.sh构建后在 build:
ctest -C Release --output-on-failure多进程(示例 4 进程)针对单独的分布式测试:
mpiexec -n 4 .\csr4mpi_tests.exe --gtest_filter=MpiMatrixMarketLargeTest.DistributedLargeSpMVAccuracy
mpiexec -n 4 .\csr4mpi_tests.exe --gtest_filter=MpiMatrixMarketLargeTest.DistributedDuplicateAssembly
mpiexec -n 4 .\csr4mpi_tests.exe --gtest_filter=MpiSymmetricSpMMTest.DistributedLowerExpansionGatherMM4Proc大型矩阵测试回退逻辑:
- 首选外部下载的
bcsstk13.mtx。 - 若缺失自动尝试合成矩阵
synthetic_12k12_general.mtx(需先使用生成器创建)。 - 两者都不可用时测试标记为 skip 并输出生成提示。
生成兜底矩阵示例:
.\csr4mpi_gen_mm.exe 12000 12000 12 0 .\tests\matrices\synthetic_12k12_general.mtx可执行:csr4mpi_bench_spmv
mpiexec -n 4 .\csr4mpi_bench_spmv.exe bcsstk13.mtx 20输出示例字段:
avg / max / min:多次迭代(默认 10)后进程归约的平均/最大/最小单次耗时(秒)。nnz:全局非零元数。GFLOPs:采用公式2 * nnz / time / 1e9(一次乘加视为 2 浮点运算)。
非 MPI 下直接运行:
./csr4mpi_bench_spmv.exe bcsstk13.mtx 10也可使用本地合成矩阵(不依赖外部下载),通过生成器 csr4mpi_gen_mm:
.\csr4mpi_gen_mm.exe 8000 8000 12 0 .\tests\matrices\synthetic_8k12_general.mtx
.\csr4mpi_gen_mm.exe 12000 12000 10 1 .\tests\matrices\synthetic_12k10_sym_lower.mtx
mpiexec -n 4 .\csr4mpi_bench_spmv.exe synthetic_8k12_general.mtx 20
mpiexec -n 4 .\csr4mpi_bench_spmv.exe synthetic_12k10_sym_lower.mtx 20库采用 C++ 模板实现多标量类型支持,四种类型在同一次编译中均可使用,无需切换编译开关:
| 别名 | 完整类型 |
|---|---|
cCSRMatrixF |
cCSRMatrix<float> |
cCSRMatrixD |
cCSRMatrix<double> |
cCSRMatrixCF |
cCSRMatrix<std::complex<float>> |
cCSRMatrixCD |
cCSRMatrix<std::complex<double>> |
#include "CSRMatrix.h"
#include "Operations.h"
using namespace csr4mpi;
// 所有类型在同一程序中同时可用
cCSRMatrixD matDouble(0, n, n, rowPtr, colInd, valuesDouble);
cCSRMatrixCF matComplexFloat(0, n, n, rowPtr, colInd, valuesComplexFloat);
// SpMV 操作
std::vector<double> xD(n, 1.0), yD;
SpMV(matDouble, xD, yD);
std::vector<std::complex<float>> xCF(n, {1.0f, 0.0f}), yCF;
SpMV(matComplexFloat, xCF, yCF);
// 也可以直接使用模板形式
cCSRMatrix<std::complex<double>> matCD(...);Global.h 提供以下编译期类型检测与转换工具:
is_complex_v<T>:判断T是否为std::complex<>类型。is_supported_scalar_v<T>:判断T是否为支持的四种标量之一。real_type_t<T>:获取标量的实部类型(实数类型返回自身,复数返回其分量类型)。
static_assert(is_complex_v<std::complex<double>>); // true
static_assert(!is_complex_v<double>); // true (double is not complex)
static_assert(is_supported_scalar_v<float>); // true
static_assert(std::is_same_v<real_type_t<std::complex<float>>, float>); // true若矩阵以下三角形式存储(Matrix Market symmetric lower),在分布式 SpMV/SpMM 中:
- 本地展开:补全镜像列贡献。
- 远程展开:对需要的镜像条目进行分桶发送与累加,避免重复计算。
include/Global.h:类型定义、类型特征(is_complex_v、is_supported_scalar_v、real_type_t)与 MPI 辅助函数。include/CSRMatrix.h:模板化 CSR 本地块cCSRMatrix<Scalar>与类型别名。include/Distribution.h/src/Distribution.cpp:行分布。include/CommPattern.h:模板化远程条目通信模式cCommPattern<Scalar>。include/CSRComm.h:模板化汇总装配逻辑cCSRComm<Scalar>。include/MumpsAdapter.h:模板化 MUMPS 导出cMumpsAdapter<Scalar>。include/Operations.h:模板化 SpMV/SpMM 操作。include/MatrixMarketLoader.h:模板化 Matrix Market 文件加载器。include/DistributedOps.h:分布式 SpMV 操作。bench/bench_large_spmv.cpp:SpMV 性能基准。tests/:GoogleTest 单元与 MPI 分布式测试。tests/test_all_scalar_types.cpp:针对四种标量类型的全面测试(52 个测试用例)。
- 更高效装配(行内列索引二分/哈希)
- SpMM 进一步通信压缩与重用
- 更多矩阵与可复现基准统计 (CSV)
本项目基于 MIT License 开源。