Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 浮点数与定点数:英特尔I5 CPU上的速度_Performance_Matrix_Sse_Simd_Openblas_X86 - Fatal编程技术网

Performance 浮点数与定点数:英特尔I5 CPU上的速度

Performance 浮点数与定点数:英特尔I5 CPU上的速度,performance,matrix,sse,simd,openblas,x86,Performance,Matrix,Sse,Simd,Openblas,X86,我有一个C/C++程序,它涉及密集的32位浮点矩阵数学计算,如加法、减法、乘法、除法等 我可以通过将32位浮点数字转换为16位定点数字来加速我的程序吗?我能获得多少速度增益 目前我正在使用Intel I5 CPU。我正在使用Openblas执行矩阵计算。我应该如何重新实现Openblas函数(如cblas_dgemm)以执行定点计算 我知道SSE(简单单指令多数据扩展指令集)一次处理4x32=8x16=128位数据,即4 32位浮点型或8 16位定点型。我想从32位浮点转换到16位定点后,我的程

我有一个C/C++程序,它涉及密集的32位浮点矩阵数学计算,如加法、减法、乘法、除法等

我可以通过将32位浮点数字转换为16位定点数字来加速我的程序吗?我能获得多少速度增益

目前我正在使用Intel I5 CPU。我正在使用Openblas执行矩阵计算。我应该如何重新实现Openblas函数(如cblas_dgemm)以执行定点计算


我知道SSE(简单单指令多数据扩展指令集)一次处理4x32=8x16=128位数据,即4 32位浮点型或8 16位定点型。我想从32位浮点转换到16位定点后,我的程序速度会快两倍。

摘要:现代FPU硬件很难用定点来击败,即使每个向量的元素数是原来的两倍

现代BLAS库通常针对缓存性能(使用缓存阻塞/循环平铺)以及指令吞吐量进行了很好的调整。这使得他们很难被击败。特别是DGEMM对于这种优化有很大的空间,因为它对O(N^2)数据进行O(N^3)处理,所以只转换一个输入的缓存大小的块是值得的,诸如此类

通过以16位半浮点数格式存储浮点数,可以减少内存瓶颈。没有硬件支持以该格式对它们进行数学运算,只有两条指令在加载/存储时在该格式和普通32位元素浮点向量之间进行转换:和。这两条指令组成了第一条指令,第一条指令由AMD推土机和Intel IvyBridge支持

IDK,如果任何BLAS库支持该格式


定点: SSE/AVX没有任何整数除法指令。但是,如果您只需要除以常量,则可能不需要真正的div指令。所以这是固定点的一个主要障碍

固定点的另一个大缺点是在乘法后改变小数点(二进制?)位置的额外成本。这将消耗你们从16位定点的每个向量中有两倍多的元素所获得的任何收益

SSE/AVX实际上有相当好的压缩16位乘法器选择(比任何其他元素大小都好)。压缩乘法产生低半部、高半部(有符号或无符号),甚至从顶部以下的2位中提取16位,并进行舍入()。Skylake以每时钟2次的速度运行,延迟时间为5个周期。也有整数乘法加法指令,但它们在乘法结果对之间进行水平加法。(请参阅,以及TagWiki的性能链接。)Haswell和previous没有那么多的整数向量加法和乘法执行单元。通常,代码瓶颈取决于uop的总吞吐量,而不是特定的执行端口。(但一个好的BLAS库甚至可能有手动调整的asm。)

如果输入和输出是整数,则处理整数向量通常比转换为浮点更快。(例如,请参阅上的答案,其中我使用16位定点处理8位整数)

但是如果你真的在使用浮点数,并且有很多乘法和除法的事情要做,就使用硬件FPU。它们在现代CPU中具有惊人的强大功能,并使定点处理器在许多任务中基本过时。正如@Iwill指出的,FMA指令是FP吞吐量(有时是延迟)的又一个巨大提升



整数加法/减法/比较指令(但不是乘法)的延迟也比FP指令低。

不太可能,尤其是在Haswell及其浮点FMA指令上,除非您有非常具体的用例可以从中受益,例如,
pmaddubsw
PMULHRSW
。冒着声明明显错误的风险,你能访问GPU吗?如果是这样,你可能想看看嗨,肖恩,这是我遇到的一个有趣的资源;它还引用了可能有用的信息;再次抱歉,这不是一个直接的答案,感觉有点迟钝:)我可以通过查看Agner Fog的表格确认Haswell+上的float是正确的选择。Haswell可以使用2个八元素向量FMA/cycle/core来维持32个触发器/周期/核心,但只能维持1个pmaddubsw或pmulhrsw+1个paddw/周期/核心(2个十六元素向量运算=32个16位整数运算/周期/核心总数)。所以你只需要使用OpenBLAS就可以获得更高的精度和更少的复杂性。啊,你是一个机器学习者!你本可以在前面主动提出(!)。这是CNN吗?如果是这样,考虑看和。除此之外,定点是一个活跃的研究领域,但英特尔处理器不适合利用这一优势。正如doug所说,英特尔CPU真正受益的唯一使用案例是,如果您完全受到内存瓶颈的限制,即使如此,只有通过整数加法/减法才能减少延迟,而且吞吐量更高!在Haswell上,每个CC可以在端口1和5上维持两个
padd*
,在端口2和3上维持两个VMOVAP。在16位定点时,计算结果为32个加法/CC,而浮点加法,即使使用FMA
d=a*1.0+c
,也只能达到16个加法/CC。对于奖励积分,
padd*
可以在不受惩罚的情况下达到饱和。@IwillnotexistIdonotexist:是的,对于add/sub来说,事情非常好,每个向量的元素数量是原来的两倍。