[gambit-list] Bignum speed with different configuration options

Bradley Lucier lucier at math.purdue.edu
Fri Jun 2 14:31:17 EDT 2017


Marc:

I decided to compare the speed of a simple program to compute pi using 
the Chudnovsky's algorithm under two different configurations.  The 
first is my usual one:

./configure 'CC=/usr/local/gcc-7.1.0/bin/gcc -march=native 
-D___CAN_IMPORT_CLIB_DYNAMICALLY' '--enable-single-host' 
'--enable-multiple-versions' '--enable-shared'

The second added

--enable-c-opt=-O2 --enable-gcc-opts --enable-gnu-gcc-no-strict-aliasing=no

I was pretty surprised at the difference in performance:

heine:~> ./chud2
(time (number->string (pi 1000000)))
     3499 ms real time
     3500 ms cpu time (3468 user, 32 system)
     462 collections accounting for 89 ms real time (100 user, 0 system)
     863430184 bytes allocated
     47370 minor faults
     no major faults

for the first, and

heine:~> ./chud2
(time (number->string (pi 1000000)))
     2604 ms real time
     2604 ms cpu time (2560 user, 44 system)
     462 collections accounting for 79 ms real time (76 user, 4 system)
     863429856 bytes allocated
     47360 minor faults
     no major faults

for the second.  I was a bit surprised at the size of the difference.

The main loop of either the direct or the inverse FFT (I can't tell 
which at the moment) is translated to

.L5952:
	movq	32(%rsp), %rax
	leaq	(%r9,%rbx), %rcx
	vmovsd	(%rbx), %xmm1
	leaq	(%r9,%r11), %rsi
	vmovsd	(%rcx), %xmm8
	leaq	(%rsi,%r9), %r8
	leaq	(%r9,%rcx), %rdi
	vmovsd	(%rsi), %xmm10
	movq	%rax, 152(%rsp)
	leaq	0(%rbp,%r10), %rax
	vmovsd	(%r11), %xmm9
	leaq	(%r9,%rdi), %r13
	vsubsd	%xmm8, %xmm1, %xmm7
	vaddsd	%xmm8, %xmm1, %xmm11
	vmovsd	(%rdi), %xmm4
	vmovsd	(%rdi), %xmm1
	movq	%rax, 168(%rsp)
	movq	32(%rsp), %rax
	vsubsd	%xmm10, %xmm9, %xmm0
	vaddsd	%xmm10, %xmm9, %xmm10
	vmovsd	7(%r12), %xmm13
	vmovsd	15(%r12), %xmm12
	addq	$16, %rbx
	addq	$16, %r11
	addq	%r10, %rax
	vsubsd	0(%r13), %xmm4, %xmm4
	vaddsd	0(%r13), %xmm1, %xmm9
	movq	%rax, 88(%rsp)
	leaq	0(%rbp,%r9), %rax
	vmovsd	(%r8), %xmm2
	movq	%rax, 184(%rsp)
	movq	88(%rsp), %rax
	addq	%r10, %rax
	movq	%rax, 80(%rsp)
	movq	120(%rsp), %rax
	addq	%rbp, %rax
	addq	$8, %rbp
	movq	%rax, 128(%rsp)
	movq	80(%rsp), %rax
	addq	%r10, %rax
	movq	%rax, 192(%rsp)
	movq	136(%rsp), %rax
	vmovsd	(%rax), %xmm3
	movq	144(%rsp), %rax
	vmovsd	(%rax), %xmm5
	leaq	(%r8,%r9), %rax
	vmovsd	(%rax), %xmm6
	movq	%rax, 96(%rsp)
	vmovsd	%xmm6, 72(%rsp)
	vsubsd	72(%rsp), %xmm2, %xmm2
	vmovsd	72(%rsp), %xmm1
	vmovapd	%xmm5, %xmm6
	vaddsd	(%r8), %xmm1, %xmm8
	vmulsd	%xmm7, %xmm3, %xmm1
	vxorpd	%xmm15, %xmm6, %xmm6
	addq	$8, 32(%rsp)
	vfmadd231sd	%xmm0, %xmm5, %xmm1
	vmulsd	%xmm0, %xmm3, %xmm0
	vfnmadd231sd	%xmm7, %xmm5, %xmm0
	vmulsd	%xmm4, %xmm6, %xmm5
	vmovapd	%xmm5, %xmm7
	vsubsd	%xmm8, %xmm10, %xmm5
	vfmadd231sd	%xmm2, %xmm3, %xmm7
	vmulsd	%xmm2, %xmm6, %xmm2
	vmovapd	%xmm3, %xmm6
	vfnmadd132sd	%xmm4, %xmm2, %xmm6
	vsubsd	%xmm9, %xmm11, %xmm4
	vaddsd	%xmm9, %xmm11, %xmm11
	vsubsd	%xmm7, %xmm1, %xmm2
	vaddsd	%xmm7, %xmm1, %xmm7
	vmovsd	%xmm11, -16(%rbx)
	vaddsd	%xmm8, %xmm10, %xmm11
	vsubsd	%xmm6, %xmm0, %xmm3
	vaddsd	%xmm6, %xmm0, %xmm6
	vmulsd	%xmm5, %xmm13, %xmm0
	vmovsd	%xmm11, -16(%r11)
	vmovsd	%xmm7, (%rcx)
	vmulsd	%xmm4, %xmm13, %xmm7
	vmovsd	%xmm6, (%rsi)
	vfnmadd132sd	%xmm12, %xmm0, %xmm4
	vmulsd	%xmm3, %xmm13, %xmm0
	vfmadd231sd	%xmm5, %xmm12, %xmm7
	vmulsd	%xmm2, %xmm13, %xmm5
	vmovsd	%xmm7, (%rdi)
	movq	96(%rsp), %rdi
	vmovapd	%xmm5, %xmm7
	vmovsd	%xmm4, (%r8)
	vfmadd231sd	%xmm3, %xmm12, %xmm7
	vfnmadd132sd	%xmm2, %xmm0, %xmm12
	vmovsd	%xmm7, 0(%r13)
	vmovsd	%xmm12, (%rdi)
	cmpq	%rbp, 48(%rsp)
	jg	.L5952

Looking at the output of the scheduler, it seems like this loop, with 40 
floating-point operations, was scheduled in 74 cycles.  Not bad.  With 
the original options it was schedule in 91 cycles.

Brad


More information about the Gambit-list mailing list