【发布时间】:2017-02-02 07:33:15
【问题描述】:
我有一个 C/C++ 程序,其中涉及密集的 32 位浮点 矩阵数学计算,例如加法、减法、乘法、除法等。
我可以通过将 32 位浮点 数转换为 16 位定点 数来加快我的程序吗?我可以获得多少速度增益?
目前我正在使用 Intel I5 CPU。我正在使用 Openblas 执行矩阵计算。我应该如何重新实现诸如 cblas_dgemm 之类的 Openblas 函数来执行定点计算?
我知道 SSE(Simple SIMD Extensions)一次对 4x32=8x16=128 位数据进行操作,即 4 个 32 位浮点类型或 8 个 16 位定点类型。我猜从 32 位浮点数转换为 16 位定点数后,我的程序会快两倍。
【问题讨论】:
-
不太可能,尤其是在 Haswell 及其浮点 FMA 指令上,除非您有非常具体的用例可以从中受益,例如
pmaddubsw或PMULHRSW。 -
冒着明显的风险,你能访问 GPU 吗?如果是这样,您可能想查看github.com/xianyi/clOpenBLAS
-
嗨,Shawn,这是我遇到的一个有趣的资源nicolas.limare.net/pro/notes/2014/12/12_arit_speed;它也引用了agner.org/optimize,这可能有用;再次抱歉,这不是一个直接的答案,感觉有点迟钝:)
-
我可以通过查看 Agner Fog 的表格来确认在 Haswell+ 上,浮动是要走的路。 Haswell 可以使用 2 个八元素向量 FMA/周期/内核维持 32 个 FLOP/周期/内核,但只能维持 1 个 pmaddubsw 或 pmulhrsw + 1 个 paddw/周期/内核(2 个 16 元素向量运算 = 32 个 16 位整数运算/周期/核心总数)。因此,您只需使用 OpenBLAS 即可获得更高的精度和更低的复杂性。
-
啊,你是机器学习者!你本可以预先自愿的(!)。这是CNN吗?如果是这样,请考虑查看Winograd convolution 和Intel's DNN package。除此之外,定点是一个活跃的研究领域,但英特尔处理器不适合利用。正如道格所说,它真正使英特尔 CPU 受益的唯一用例是,如果您完全是内存瓶颈,即使这样也只有
标签: performance matrix sse simd openblas