假设我有:
double f(const double *r) {
return 0*(r[0]*r[1]);
}
Run Code Online (Sandbox Code Playgroud)
如果值可能是inf或nan,编译器是否应该能够优化分段,还是必须执行操作?
gcc -O3 -S test.c:
.file "test.c"
.text
.p2align 4,,15
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
movsd (%rdi), %xmm0
mulsd 8(%rdi), %xmm0
mulsd .LC0(%rip), %xmm0
ret
.cfi_endproc
.LFE0:
.size f, .-f
.section .rodata.cst8,"aM",@progbits,8
.align 8
.LC0:
.long 0
.long 0
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)
似乎没有消除?
啊哈:
gcc -O3 -ffast-math -S test.c
.file "test.c"
.text
.p2align 4,,15
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
xorpd %xmm0, …Run Code Online (Sandbox Code Playgroud) 如何在C中简化以下代码(当然使用SIMD内在函数)?我无法理解SIMD内在函数,这会有很大帮助:
int sum_naive( int n, int *a )
{
int sum = 0;
for( int i = 0; i < n; i++ )
sum += a[i];
return sum;
}
Run Code Online (Sandbox Code Playgroud)