我正在做一个程序,它需要两个 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);
}
}
我看不到这些功能是如何工作的(我没有“心理形象”)。