gpt4 book ai didi

c - C中的填充矩阵

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:33 28 4
gpt4 key购买 nike

我尝试使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com