【发布时间】:2014-07-10 07:00:19
【问题描述】:
我已经编写了一个函数来进行 4x4 矩阵的转置,但我不知道如何扩展矩阵 m x n 的代码。
在哪里可以找到一些关于 SSE 矩阵运算的示例代码?乘积、转置、逆等?
这是转置4x4的代码:
void transpose(float* src, int n) {
__m128 row0, row1, row2, row3;
__m128 tmp1;
tmp1=_mm_loadh_pi(_mm_loadl_pi(tmp1, (__m64*)(src)), (__m64*)(src+ 4));
row1=_mm_loadh_pi(_mm_loadl_pi(row1, (__m64*)(src+8)), (__m64*)(src+12));
row0=_mm_shuffle_ps(tmp1, row1, 0x88);
row1=_mm_shuffle_ps(row1, tmp1, 0xDD);
tmp1=_mm_movelh_ps(tmp1, row1);
row1=_mm_movehl_ps(tmp1, row1);
tmp1=_mm_loadh_pi(_mm_loadl_pi(tmp1, (__m64*)(src+ 2)), (__m64*)(src+ 6));
row3= _mm_loadh_pi(_mm_loadl_pi(row3, (__m64*)(src+10)), (__m64*)(src+14));
row2=_mm_shuffle_ps(tmp1, row3, 0x88);
row3=_mm_shuffle_ps(row3, tmp1, 0xDD);
tmp1=_mm_movelh_ps(tmp1, row3);
row3=_mm_movehl_ps(tmp1, row3);
_mm_store_ps(src, row0);
_mm_store_ps(src+4, row1);
_mm_store_ps(src+8, row2);
_mm_store_ps(src+12, row3);
}
【问题讨论】:
-
您真的想就地转置 MxN 矩阵(困难)还是只想转置方形 (NxN) 矩阵(简单)?
-
理论上 M x N... 但 N x N 也不错...
-
我不明白为什么 SSE 相关的问题被否决了。您要针对 SSE 还是 SSE2 进行优化? Here 是使用 SSE2 转置 4x4 矩阵的更优解决方案。
-
不是 4x4 解决方案,而是通用解决方案……如果不是 M x N,则至少 N x N