一、开发环境配置
1.1 启用C++ 20
在VS2022中新建项目后右键项目
1.2 启用增强指令集
1.3 安装Google Test
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 浮点精度控制
- 后续求逆误差验证需使用双精度或高精度算法,此处暂时用单精度。