【C++游戏引擎开发】《线性代数》(2):矩阵加减法与SIMD集成 ...

打印 上一主题 下一主题

主题 1930|帖子 1930|积分 5790

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、矩阵加减法数学原理

1.1 界说



  • ​逐元素操纵:运算仅针对雷同位置的元素,不涉及矩阵乘法或行列变换。
  • ​交换律与结合律:
    加法满意交换律(A + B = B + A)和结合律( ( A + B ) + C = A + ( B + C ) )。
    ​减法不满意交换律(A − B ≠ B − A)。
1.2 公式

​ C i j = A i j + B i j (矩阵加法) C_{ij} = A_{ij} + B_{ij} \quad \text{(矩阵加法)} Cij​=Aij​+Bij​(矩阵加法)
  C i j = A i j − B i j (矩阵减法) C_{ij} = A_{ij} - B_{ij} \quad \text{(矩阵减法)} Cij​=Aij​−Bij​(矩阵减法)
前提条件:两个矩阵的行列数必须雷同。
<hr> 二、SIMD指令集简介

2.1 AVX2基础



  • 256位寄存器(__m256),单寄存器可存储8个float。
  • 关键指令:
  1. _mm256_load_ps()    // 从对齐内存加载数据到寄存器  
  2. _mm256_add_ps()     // 寄存器加法
  3. _mm256_sub_ps()     // 寄存器减法  
  4. _mm256_store_ps()   // 将寄存器数据存回内存  
复制代码
2.2 头文件

  1. #include <immintrin.h>  // AVX指令集头文件  
复制代码
<hr> 三、SIMD优化矩阵加法实现

3.1 内存管理与对齐

  1. Matrix(size_t rows, size_t cols)
  2.     : rows_(rows), cols_(cols),
  3.       data_(static_cast<float*>(_aligned_malloc(rows* cols * sizeof(float), kSimdAlignment))) {
  4.    
  5.     if (!data_) throw std::bad_alloc();
  6.     // 显式初始化内存为0
  7.     std::memset(data_, 0, rows * cols * sizeof(float));
  8. }
  9. ~Matrix() {
  10.     _aligned_free(data_); }
复制代码


  • 功能:确保矩阵数据内存按32字节对齐(AVX2指令集要求)
  • 关键点
    a) 使用 _aligned_malloc 分配对齐内存
    b) 析构时通过 _aligned_free 开释内存
    c) 内存不敷时抛出 bad_alloc 异常
3.2 二维下标访问

  1. class RowProxy {
  2.    
  3. public:
  4.     float& operator[](size_t col) {
  5.    
  6.         if (col >= cols_) throw std::out_of_range("Column index out of range");
  7.         return row_start_[col];
  8.     }
  9.     // ...
  10. };
  11. RowProxy operator[](size_t row) {
  12.    
  13.     if (row >= rows_) throw std::out_of_range("Row index out of range");
  14.     return RowProxy(data_ + row * cols_, cols_);
  15. }
复制代码


  • 设计目标:实现类似原生二维数组的 matrix[j] 语法
  • 实现原理
    a) operator[] 返回临时代理对象 RowProxy
    b) 代理对象二次重载 operator[] 实现列访问
    c) 每次访问自动验证行列索引合法性
  • 上风
    a) 语法直观:mat[1][2] = 3.0f;
    b) 安全性:自动边界检查
    c) 性能:代理对象轻量(仅存储指针和列数)
3.3 SIMD优化加减法

  1. Matrix add_simd(const Matrix& other) const {
  2.    
  3.     validate_dimension(other); // 维度校验
  4.     Matrix result(rows_, cols_);
  5.    
  6.     // AVX指令处理主体数据(每次8个float)
  7.    
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表