我尝试使用 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(int
或 float
,而不是 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/