一、开发环境配置
1.1 启用C++ 20
在VS2022中新建项目后右键项目
1.2 启用增强指令集
1.3 安装Google Test
vcpkg安装使用指南
vcpkg install gtest:x64-windows# 集成到系统目录,只需要执行一次,后续安装包之后不需要再次执行
vcpkg integrate install
二、基础矩阵类设计
核心需求:动态大小、内存对齐(SIMD友好)、基础接口。
2.1 完整代码
#include <cstdint>
#include <memory>
#include <stdexcept>
#include <gtest/gtest.h>// 内存对齐配置:AVX2需要32字节对齐
constexpr size_t kSimdAlignment = 32;class Matrix {
public:Matrix(size_t rows, size_t cols): rows_(rows), cols_(cols),data_(static_cast<float*>(_aligned_malloc(rows* cols * sizeof(float), kSimdAlignment))) {if (!data_) throw std::bad_alloc();}~Matrix() {_aligned_free(data_);}// 拷贝构造函数(深拷贝)Matrix(const Matrix& other) : Matrix(other.rows_, other.cols_) {for (size_t i = 0; i < rows_ * cols_; ++i) {data_[i] = other.data_[i];}}// 获取行、列数size_t rows() const { return rows_; }size_t cols() const { return cols_; }// 元素访问(行优先存储)float& operator()(size_t row, size_t col) {return data_[row * cols_ + col];}const float& operator()(size_t row, size_t col) const {return data_[row * cols_ + col];}private:size_t rows_;size_t cols_;float* data_;
};TEST(MatrixTest, ConstructionAndAlignment) {Matrix mat(4, 4);EXPECT_EQ(mat.rows(), 4);EXPECT_EQ(mat.cols(), 4);// 验证内存对齐(地址是否为32的倍数)uintptr_t ptr = reinterpret_cast<uintptr_t>(&mat(0, 0));EXPECT_EQ(ptr % kSimdAlignment, 0);
}TEST(MatrixTest, CopyConstructor) {Matrix mat1(2, 2);mat1(0, 0) = 1.0f;Matrix mat2 = mat1;EXPECT_EQ(mat2(0, 0), 1.0f);
}int main(int argc, char** argv) {testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
2.2 运行测试结果
三、注意事项
3.1 SIMD兼容性检查
- 确保CPU支持AVX2指令集(Intel Haswell及以上,AMD Excavator及以上)。
- 运行时崩溃?检查内存对齐是否合规。
3.2 浮点精度控制
- 后续求逆误差验证需使用双精度或高精度算法,此处暂时用单精度。