有效的SSE NXN矩阵乘法
Efficient SSE NxN matrix multiplication
我正在尝试通过矩阵乘法实现大矩阵的SSE
版本。 我正在寻找基于SIMD
实现的有效算法。
我所需的方法看起来像:
A(n x m) * B(m x k) = C(n x k)
,所有矩阵都被认为是16字节对齐的浮子阵列。
我搜索了网络,发现了一些描述8x8乘法甚至更小的文章。我确实需要尽可能高效,并且不想使用Eigen
库或类似库。(仅SSE3
更具体)。
因此,我很感激是否有人可以帮助我找到一些有关如何开始实施此问题的文章或资源。
实现任意大小矩阵矩阵乘法的主要挑战不是使用SIMD,而是重复使用缓存数据。如果您想实现对缓存友好的矩阵乘积,则必须通过Goto和van de geijn进行高性能矩阵乘法的论文解剖结构,这是必读的,它还讨论了要对SIMD友好友好的内核的选择。阅读本文后,预计在两周的努力后,在基质矩阵乘法上实现了50%的机器峰值。
但是,如果这项工作的目的不是纯学习,我强烈建议使用高度优化的库。在X86上,您的最佳选择是OpenBlas(BSD许可,支持动态CPU调度),BLIS(BSD许可,易于移植到新处理器)和Intel MKL(商业支持,支持在Intel处理器上进行动态CPU调度)。出于绩效原因,最好避免Atlas,除非您针对其他图书馆不支持的非常异国情调的建筑。
相关文章:
- C++ SSE 内部函数:将结果存储在变量中
- Constexpr and SSE intrinsics
- 如何使用SSE将__m128i注册乘以浮点因子?
- 如何计算矩阵NxN的行列式?[递归]
- 使用SSE内部函数复制少量数据时出现问题
- 可以在 macOS 上启用的最低支持的 SSE 标志是什么?
- SSE 标志应该如何与现代 CMake 一起添加?
- 快速 SSE 射线 - 4 三角形交叉点
- 使用 SSE 以最快的速度缩小 8 位灰度图像
- 如何用SSE优化矩阵3乘3乘法与点?
- 使用双精度运算的快速 SSE 低精度指数
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 单精度矩阵运算的特征性能 AVX 与 SSE 没有区别?
- 编写 std::copysign 的可移植 SSE/AVX 版本
- SSE 内联汇编和可能的 g++ 优化错误
- SSE 整数 2^n 的 2 次方,对于没有 AVX2 的 32 位整数
- 带有SSE的有条件陈述
- SSE和iostream:浮点类型的错误输出
- 使用 SSE/AVX 获取存储在__m256d中的值的总和
- 有效的SSE NXN矩阵乘法