c - C中的填充矩阵

标签 c matrix sse transpose

我尝试使用 SSE 转置我的矩阵。但它只能适合N可以被4整除的矩阵。所以我想填充矩阵来重新格式化它。

比如3*3的矩阵,应该填充成4*4的矩阵:

1 2 3    1 2 3 0 
4 5 6 => 4 5 6 0
7 8 9    7 8 9 0
         0 0 0 0

有什么有效的方法吗?而且我不确定是否需要花费时间来填充它,SSE 转置是否会比循环每个索引更慢......

最佳答案

您实际上不需要填充,对吗?您只是建议将其作为一种使用您已有的 4x4 SSE 转置例程的方法,对吗?

矩阵转置不会移动对角线元素(包括第一个和最后一个)。 3x3 转置的数据移动要少得多:只需加载/存储 7 个元素。

1 2 3    1 4 7
4 5 6 => 2 5 8
7 8 9    3 6 9

AVX2:

如果您的元素是 4B(intfloat,而不是 double),则前 8 个元素适合单个 AVX vector 。 AVX2 有一个完整的车道交叉洗牌,vpermps .因此,整个转置可以通过一次加载/_mm256_permutevar8x32_ps/store 完成。它在 Intel Haswell 上具有每时钟一个吞吐量和三个周期延迟。

由于最后一个元素不需要移动,所以您根本不需要触摸它,如果您没有就地移调,则只需复制它即可。


仅使用 SSE,您可以加载两个包含前八个元素的 vector ,并使用 shufps 或其他方法将它们相互打乱,以组合每个 vector 中的元素。

或者可以随机创建一个 { 1 4 3 2 } vector 和一个 { 5 8 7 6 } vector ,然后将元素 7 混合到第一个中,然后将元素 3 混合到第二个中。

无论如何,3x3 比 4x4 更容易转置,所以如果您以后不需要在整行上使用 SSE,请不要填充到 4x4。

关于c - C中的填充矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37093848/

相关文章:

Matlab 矩阵乘法忽略 nans?

c++ - 为什么用 SSE 进行矩阵乘法比较慢?

c - 静态函数范围指针和内存泄漏

c - 特定大小和顺序的位字段

c++ - 常量的 k 前缀从何而来?

c - 结构赋值还是 memcpy?

java - 如何在java中创建动态二维矩阵?

python - 如何使用 Spark 创建稀疏 CSCMatrix?

c++ - 将浮点 vector 转换为 16 位 int 而不饱和

linux-kernel - Linux 内核是否有自己的 SSE/AVX 上下文?