Tag: fma

英特尔Broadwell处理器中出现的重大FMA性能exception

代码1: vzeroall mov rcx, 1000000 startLabel1: vfmadd231ps ymm0, ymm0, ymm0 vfmadd231ps ymm1, ymm1, ymm1 vfmadd231ps ymm2, ymm2, ymm2 vfmadd231ps ymm3, ymm3, ymm3 vfmadd231ps ymm4, ymm4, ymm4 vfmadd231ps ymm5, ymm5, ymm5 vfmadd231ps ymm6, ymm6, ymm6 vfmadd231ps ymm7, ymm7, ymm7 vfmadd231ps ymm8, ymm8, ymm8 vfmadd231ps ymm9, ymm9, ymm9 vpaddd ymm10, ymm10, ymm10 vpaddd ymm11, ymm11, ymm11 vpaddd […]

在L1caching上获取Haswell的峰值带宽:只有62%

我试图在L1caching中获得全部带宽,以便在Intel处理器上使用以下function float triad(float *x, float *y, float *z, const int n) { float k = 3.14159f; for(int i=0; i<n; i++) { z[i] = x[i] + k*y[i]; } } 这是STREAM的三合一function。 使用此function的SandyBridge / IvyBridge处理器(使用与NASM的汇编)可获得95%的峰值。 但是,除非我展开循环,否则使用Haswell I只能达到峰值的62%。 如果我展开16次,我得到92%。 我不明白这一点。 我决定使用NASM在汇编中编写我的function。 assembly中的主循环看起来像这样。 .L2: vmovaps ymm1, [rdi+rax] vfmadd231ps ymm1, ymm2, [rsi+rax] vmovaps [rdx+rax], ymm1 add rax, 32 jne .L2 在例子12.7-12.11的Agner […]