1

我正在做一个程序,它需要两个 4x4 矩阵并使用 Intrinsics 将它们相乘。到目前为止我所理解的:

  • MMX/SSE 指令集可让您加速计算。特别是它使用 4 字节元素向量。
  • __m128表示一个 16 字节向量(4 个字节的 4 个元素)。此外,__m128数据需要对齐才能工作。

我迷路的地方在这里:

  • 函数_mm_mul_ps(_m128, _m128)(如我所读)采用两个 16 字节向量,4 个 4 字节浮点数。它将两个向量“一对一”相乘并返回 a _m128。但是,该_m128向量究竟包含什么(what的结果)?
  • 函数_mm_hadd_ps(_m128, _m128)添加两个 16 字节向量(每个 4 字节浮点数)。它以这种方式“水平添加”:
    vectorA(a1, a2, a3,a4) + vectorB(b1, b2, b3, b4) = vectorResult(a1 + a2, a3 + a4, b1 + b2, b3 + b4)

我正在尝试做的事情:

// Stores the result of multiply on row of A by one column of B
    _declspec (align(16)) __m128 aux; 

        // Horizontal add
        for(int i = 0; i < 4; i++){
            for (int j = 0; j < 4; j++){
                aux= _mm_mul_ps(vectorA[i], vectorB[j]);
                // Add results
                aux = _mm_hadd_ps(aux, aux);
                aux = _mm_hadd_ps(aux,aux);
            }
        }

看不到这些功能是如何工作的(我没有“心理形象”)。

4

0 回答 0