[std-interval] C++ interval std
Steve Clamage
Stephen.Clamage at Sun.COM
Thu Apr 6 03:19:03 PDT 2006
The Interval class is the one posted by Alan Eliasen,
except that I removed the tag member from the Interval class,
leaving only 2 doubles.
In the compiled code, all the Interval functions were inlined,
so there are no calls to the functions. Here are two extracts
from the source code, along with the generated amd64 code.
I can also post the sparc code if you like.
First, the call-by-value part.
The compiler unrolled the loop 4 times.
32 start = clock();
33 for (i=0; i<upper; i++)
34 {
35 c.upper += addByValue( a, addByValue(Interval(i,0), b) ).upper;
36 }
37 end = clock();
call clock ;/ line : 32
movq %rax,%r12 ;/ line : 32
movlpd .tim.0+32,%xmm0 ;/ line : 26
movlpd %xmm0,72(%rsp) ;/ line : 33
movq 48(%rsp),%r8 ;/ line : 33
movq 56(%rsp),%r9 ;/ line : 33
movq %r8,160(%rsp) ;/ line : 33
movq %r9,168(%rsp) ;/ line : 33
movq 32(%rsp),%r8 ;/ line : 33
movq 40(%rsp),%r9 ;/ line : 33
movq %r8,224(%rsp) ;/ line : 33
movq %r9,232(%rsp) ;/ line : 33
.LP0.382:
movlpd 160(%rsp),%xmm6 ;/ line : 35
movlpd 168(%rsp),%xmm5 ;/ line : 35
movlpd 224(%rsp),%xmm4 ;/ line : 35
movlpd 232(%rsp),%xmm3 ;/ line : 35
xorl %eax,%eax ;/ line : 35
movlpd .tim.0+40,%xmm2 ;/ line : 35
movlpd .tim.0+32,%xmm1
movlpd .tim.0+32,%xmm0
movlpd %xmm0,-8(%rbp)
.zalign 16,8
.CGB.191:
movlpd %xmm1,64(%rsp) ;/ line : 35
movq 64(%rsp),%r8 ;/ line : 35
movq 72(%rsp),%r9 ;/ line : 35
movq %r8,176(%rsp) ;/ line : 35
movq %r9,184(%rsp) ;/ line : 35
movlpd 176(%rsp),%xmm0 ;/ line : 35
addsd %xmm6,%xmm0 ;/ line : 35
movlpd %xmm0,192(%rsp) ;/ line : 35
movlpd 184(%rsp),%xmm0 ;/ line : 35
addsd %xmm5,%xmm0 ;/ line : 35
movlpd %xmm0,200(%rsp) ;/ line : 35
movq 192(%rsp),%xmm0 ;/ line : 35
movhpd 200(%rsp),%xmm0 ;/ line : 35
movq %xmm0,208(%rsp) ;/ line : 35
movhpd %xmm0,216(%rsp) ;/ line : 35
movlpd 208(%rsp),%xmm0 ;/ line : 35
addsd %xmm4,%xmm0 ;/ line : 35
movlpd %xmm0,240(%rsp) ;/ line : 35
movlpd 216(%rsp),%xmm0 ;/ line : 35
addsd %xmm3,%xmm0 ;/ line : 35
movlpd %xmm0,248(%rsp) ;/ line : 35
movq 240(%rsp),%r8 ;/ line : 35
movq 248(%rsp),%r9 ;/ line : 35
movq %r8,80(%rsp) ;/ line : 35
movq %r9,88(%rsp) ;/ line : 35
movlpd -8(%rbp),%xmm0 ;/ line : 35
addsd 88(%rsp),%xmm0 ;/ line : 35
addsd %xmm2,%xmm1 ;/ line : 35
movlpd %xmm1,64(%rsp) ;/ line : 35
movq 64(%rsp),%r8 ;/ line : 35
movq 72(%rsp),%r9 ;/ line : 35
movq %r8,176(%rsp) ;/ line : 35
movq %r9,184(%rsp) ;/ line : 35
movlpd 176(%rsp),%xmm7 ;/ line : 35
addsd %xmm6,%xmm7 ;/ line : 35
movlpd %xmm7,192(%rsp) ;/ line : 35
movlpd 184(%rsp),%xmm7 ;/ line : 35
addsd %xmm5,%xmm7 ;/ line : 35
movlpd %xmm7,200(%rsp) ;/ line : 35
movq 192(%rsp),%xmm7 ;/ line : 35
movhpd 200(%rsp),%xmm7 ;/ line : 35
movq %xmm7,208(%rsp) ;/ line : 35
movhpd %xmm7,216(%rsp) ;/ line : 35
movlpd 208(%rsp),%xmm7 ;/ line : 35
addsd %xmm4,%xmm7 ;/ line : 35
movlpd %xmm7,240(%rsp) ;/ line : 35
movlpd 216(%rsp),%xmm7 ;/ line : 35
addsd %xmm3,%xmm7 ;/ line : 35
movlpd %xmm7,248(%rsp) ;/ line : 35
movq 240(%rsp),%r8 ;/ line : 35
movq 248(%rsp),%r9 ;/ line : 35
movq %r8,80(%rsp) ;/ line : 35
movq %r9,88(%rsp) ;/ line : 35
addsd 88(%rsp),%xmm0 ;/ line : 35
addsd %xmm2,%xmm1 ;/ line : 35
movlpd %xmm1,64(%rsp) ;/ line : 35
movq 64(%rsp),%r8 ;/ line : 35
movq 72(%rsp),%r9 ;/ line : 35
movq %r8,176(%rsp) ;/ line : 35
movq %r9,184(%rsp) ;/ line : 35
movlpd 176(%rsp),%xmm7 ;/ line : 35
addsd %xmm6,%xmm7 ;/ line : 35
movlpd %xmm7,192(%rsp) ;/ line : 35
movlpd 184(%rsp),%xmm7 ;/ line : 35
addsd %xmm5,%xmm7 ;/ line : 35
movlpd %xmm7,200(%rsp) ;/ line : 35
movq 192(%rsp),%xmm7 ;/ line : 35
movhpd 200(%rsp),%xmm7 ;/ line : 35
movq %xmm7,208(%rsp) ;/ line : 35
movhpd %xmm7,216(%rsp) ;/ line : 35
movlpd 208(%rsp),%xmm7 ;/ line : 35
addsd %xmm4,%xmm7 ;/ line : 35
movlpd %xmm7,240(%rsp) ;/ line : 35
movlpd 216(%rsp),%xmm7 ;/ line : 35
addsd %xmm3,%xmm7 ;/ line : 35
movlpd %xmm7,248(%rsp) ;/ line : 35
movq 240(%rsp),%r8 ;/ line : 35
movq 248(%rsp),%r9 ;/ line : 35
movq %r8,80(%rsp) ;/ line : 35
movq %r9,88(%rsp) ;/ line : 35
addsd 88(%rsp),%xmm0 ;/ line : 35
addsd %xmm2,%xmm1 ;/ line : 35
movlpd %xmm1,64(%rsp) ;/ line : 35
movq 64(%rsp),%r8 ;/ line : 35
movq 72(%rsp),%r9 ;/ line : 35
movq %r8,176(%rsp) ;/ line : 35
movq %r9,184(%rsp) ;/ line : 35
movlpd 176(%rsp),%xmm7 ;/ line : 35
addsd %xmm6,%xmm7 ;/ line : 35
movlpd %xmm7,192(%rsp) ;/ line : 35
movlpd 184(%rsp),%xmm7 ;/ line : 35
addsd %xmm5,%xmm7 ;/ line : 35
movlpd %xmm7,200(%rsp) ;/ line : 35
movq 192(%rsp),%xmm7 ;/ line : 35
movhpd 200(%rsp),%xmm7 ;/ line : 35
movq %xmm7,208(%rsp) ;/ line : 35
movhpd %xmm7,216(%rsp) ;/ line : 35
movlpd 208(%rsp),%xmm7 ;/ line : 35
addsd %xmm4,%xmm7 ;/ line : 35
movlpd %xmm7,240(%rsp) ;/ line : 35
movlpd 216(%rsp),%xmm7 ;/ line : 35
addsd %xmm3,%xmm7 ;/ line : 35
movlpd %xmm7,248(%rsp) ;/ line : 35
movq 240(%rsp),%r8 ;/ line : 35
movq 248(%rsp),%r9 ;/ line : 35
movq %r8,80(%rsp) ;/ line : 35
movq %r9,88(%rsp) ;/ line : 35
addsd 88(%rsp),%xmm0 ;/ line : 35
movlpd %xmm0,-8(%rbp) ;/ line : 35
addsd %xmm2,%xmm1 ;/ line : 35
addl $4,%eax ;/ line : 35
.LU2.397:
cmpl $99999999,%eax ;/ line : 35
jle .CGB.191 ;/ line : 35
.LX0.383:
.LE0.384:
.CGC.192:
xorl %ebx,%ebx ;/ line : 45
call clock ;/ line : 37
movq %rax,%r13 ;/ line : 37
Now the call-by-const-ref part.
The compiler unrolled this loop 6 times.
52 start = clock();
53 for (i=0; i<upper; i++)
54 {
55 c.upper += addByConstRef( a, addByConstRef(Interval(i,0), b) ).upper;
56 }
57 end = clock();
call clock ;/ line : 52
movq %rax,%r12 ;/ line : 52
movlpd 56(%rsp),%xmm0 ;/ line : 53
movlpd %xmm0,296(%rsp) ;/ line : 53
movlpd 48(%rsp),%xmm4 ;/ line : 55
movlpd 32(%rsp),%xmm3 ;/ line : 55
movlpd 40(%rsp),%xmm2 ;/ line : 55
movlpd .tim.0+40,%xmm5 ;/ line : 55
movlpd .tim.0+32,%xmm1
movlpd .tim.0+32,%xmm0
movlpd %xmm0,-8(%rbp)
.zalign 16,8
.CGF.195:
movsd %xmm1,%xmm0 ;/ line : 55
addsd %xmm4,%xmm0 ;/ line : 55
movlpd %xmm0,288(%rsp) ;/ line : 55
movq 288(%rsp),%r8 ;/ line : 55
movq 296(%rsp),%r9 ;/ line : 55
movq %r8,128(%rsp) ;/ line : 55
movq %r9,136(%rsp) ;/ line : 55
movlpd 128(%rsp),%xmm0 ;/ line : 55
addsd %xmm3,%xmm0 ;/ line : 55
movlpd %xmm0,304(%rsp) ;/ line : 55
movlpd 136(%rsp),%xmm0 ;/ line : 55
addsd %xmm2,%xmm0 ;/ line : 55
movlpd %xmm0,312(%rsp) ;/ line : 55
movq 304(%rsp),%r8 ;/ line : 55
movq 312(%rsp),%r9 ;/ line : 55
movq %r8,144(%rsp) ;/ line : 55
movq %r9,152(%rsp) ;/ line : 55
movlpd -8(%rbp),%xmm0 ;/ line : 55
addsd 152(%rsp),%xmm0 ;/ line : 55
addsd %xmm5,%xmm1 ;/ line : 55
movsd %xmm1,%xmm6 ;/ line : 55
addsd %xmm4,%xmm6 ;/ line : 55
movlpd %xmm6,288(%rsp) ;/ line : 55
movq 288(%rsp),%r8 ;/ line : 55
movq 296(%rsp),%r9 ;/ line : 55
movq %r8,128(%rsp) ;/ line : 55
movq %r9,136(%rsp) ;/ line : 55
movlpd 128(%rsp),%xmm6 ;/ line : 55
addsd %xmm3,%xmm6 ;/ line : 55
movlpd %xmm6,304(%rsp) ;/ line : 55
movlpd 136(%rsp),%xmm6 ;/ line : 55
addsd %xmm2,%xmm6 ;/ line : 55
movlpd %xmm6,312(%rsp) ;/ line : 55
movq 304(%rsp),%r8 ;/ line : 55
movq 312(%rsp),%r9 ;/ line : 55
movq %r8,144(%rsp) ;/ line : 55
movq %r9,152(%rsp) ;/ line : 55
addsd 152(%rsp),%xmm0 ;/ line : 55
addsd %xmm5,%xmm1 ;/ line : 55
movsd %xmm1,%xmm6 ;/ line : 55
addsd %xmm4,%xmm6 ;/ line : 55
movlpd %xmm6,288(%rsp) ;/ line : 55
movq 288(%rsp),%r8 ;/ line : 55
movq 296(%rsp),%r9 ;/ line : 55
movq %r8,128(%rsp) ;/ line : 55
movq %r9,136(%rsp) ;/ line : 55
movlpd 128(%rsp),%xmm6 ;/ line : 55
addsd %xmm3,%xmm6 ;/ line : 55
movlpd %xmm6,304(%rsp) ;/ line : 55
movlpd 136(%rsp),%xmm6 ;/ line : 55
addsd %xmm2,%xmm6 ;/ line : 55
movlpd %xmm6,312(%rsp) ;/ line : 55
movq 304(%rsp),%r8 ;/ line : 55
movq 312(%rsp),%r9 ;/ line : 55
movq %r8,144(%rsp) ;/ line : 55
movq %r9,152(%rsp) ;/ line : 55
addsd 152(%rsp),%xmm0 ;/ line : 55
addsd %xmm5,%xmm1 ;/ line : 55
movsd %xmm1,%xmm6 ;/ line : 55
addsd %xmm4,%xmm6 ;/ line : 55
movlpd %xmm6,288(%rsp) ;/ line : 55
movq 288(%rsp),%r8 ;/ line : 55
movq 296(%rsp),%r9 ;/ line : 55
movq %r8,128(%rsp) ;/ line : 55
movq %r9,136(%rsp) ;/ line : 55
movlpd 128(%rsp),%xmm6 ;/ line : 55
addsd %xmm3,%xmm6 ;/ line : 55
movlpd %xmm6,304(%rsp) ;/ line : 55
movlpd 136(%rsp),%xmm6 ;/ line : 55
addsd %xmm2,%xmm6 ;/ line : 55
movlpd %xmm6,312(%rsp) ;/ line : 55
movq 304(%rsp),%r8 ;/ line : 55
movq 312(%rsp),%r9 ;/ line : 55
movq %r8,144(%rsp) ;/ line : 55
movq %r9,152(%rsp) ;/ line : 55
addsd 152(%rsp),%xmm0 ;/ line : 55
addsd %xmm5,%xmm1 ;/ line : 55
movsd %xmm1,%xmm6 ;/ line : 55
addsd %xmm4,%xmm6 ;/ line : 55
movlpd %xmm6,288(%rsp) ;/ line : 55
movq 288(%rsp),%r8 ;/ line : 55
movq 296(%rsp),%r9 ;/ line : 55
movq %r8,128(%rsp) ;/ line : 55
movq %r9,136(%rsp) ;/ line : 55
movlpd 128(%rsp),%xmm6 ;/ line : 55
addsd %xmm3,%xmm6 ;/ line : 55
movlpd %xmm6,304(%rsp) ;/ line : 55
movlpd 136(%rsp),%xmm6 ;/ line : 55
addsd %xmm2,%xmm6 ;/ line : 55
movlpd %xmm6,312(%rsp) ;/ line : 55
movq 304(%rsp),%r8 ;/ line : 55
movq 312(%rsp),%r9 ;/ line : 55
movq %r8,144(%rsp) ;/ line : 55
movq %r9,152(%rsp) ;/ line : 55
addsd 152(%rsp),%xmm0 ;/ line : 55
addsd %xmm5,%xmm1 ;/ line : 55
movsd %xmm1,%xmm6 ;/ line : 55
addsd %xmm4,%xmm6 ;/ line : 55
movlpd %xmm6,288(%rsp) ;/ line : 55
movq 288(%rsp),%r8 ;/ line : 55
movq 296(%rsp),%r9 ;/ line : 55
movq %r8,128(%rsp) ;/ line : 55
movq %r9,136(%rsp) ;/ line : 55
movlpd 128(%rsp),%xmm6 ;/ line : 55
addsd %xmm3,%xmm6 ;/ line : 55
movlpd %xmm6,304(%rsp) ;/ line : 55
movlpd 136(%rsp),%xmm6 ;/ line : 55
addsd %xmm2,%xmm6 ;/ line : 55
movlpd %xmm6,312(%rsp) ;/ line : 55
movq 304(%rsp),%r8 ;/ line : 55
movq 312(%rsp),%r9 ;/ line : 55
movq %r8,144(%rsp) ;/ line : 55
movq %r9,152(%rsp) ;/ line : 55
addsd 152(%rsp),%xmm0 ;/ line : 55
movlpd %xmm0,-8(%rbp) ;/ line : 55
addsd %xmm5,%xmm1 ;/ line : 55
addl $6,%ebx ;/ line : 55
.LUF.414:
cmpl $99999994,%ebx ;/ line : 55
jle .CGF.195 ;/ line : 55
.LX5.422:
.LE5.423:
.LU10.415:
movlpd 48(%rsp),%xmm2 ;/ line : 55
movlpd 32(%rsp),%xmm3 ;/ line : 55
movlpd 40(%rsp),%xmm4 ;/ line : 55
movlpd .tim.0+40,%xmm5 ;/ line : 55
.zalign 16,8
.LU11.416:
movsd %xmm1,%xmm0 ;/ line : 55
addsd %xmm2,%xmm0 ;/ line : 55
movlpd %xmm0,288(%rsp) ;/ line : 55
movq 288(%rsp),%r8 ;/ line : 55
movq 296(%rsp),%r9 ;/ line : 55
movq %r8,128(%rsp) ;/ line : 55
movq %r9,136(%rsp) ;/ line : 55
movlpd 128(%rsp),%xmm0 ;/ line : 55
addsd %xmm3,%xmm0 ;/ line : 55
movlpd %xmm0,304(%rsp) ;/ line : 55
movlpd 136(%rsp),%xmm0 ;/ line : 55
addsd %xmm4,%xmm0 ;/ line : 55
movlpd %xmm0,312(%rsp) ;/ line : 55
movq 304(%rsp),%r8 ;/ line : 55
movq 312(%rsp),%r9 ;/ line : 55
movq %r8,144(%rsp) ;/ line : 55
movq %r9,152(%rsp) ;/ line : 55
movlpd -8(%rbp),%xmm0 ;/ line : 55
addsd 152(%rsp),%xmm0 ;/ line : 55
movlpd %xmm0,-8(%rbp) ;/ line : 55
addsd %xmm5,%xmm1 ;/ line : 55
incl %ebx ;/ line : 55
cmpl $99999999,%ebx ;/ line : 55
jle .LU11.416 ;/ line : 55
.LX6.424:
.LE6.425:
.LX2.387:
.LE2.388:
call clock ;/ line : 57
---
Steve Clamage, stephen.clamage at sun.com
Guillaume Melquiond wrote:
> Le jeudi 06 avril 2006 à 00:31 -0700, Steve Clamage a écrit :
>
>
>>This result is quite different from other experiments with small structs that
>>showed pass-by-value performing better. One possibility is that the compiler is
>>missing some optimization opportunities. Another is that this example is not
>>representative.
>
>
> Is your Interval class considered a "small struct" by the ABIs you
> tested? According to the AMD64 ABI, it should be, since it is two
> doubles; but I am not completely sure. If it is not, then pass-by-value
> will go through the stack and will be a lot worse than pass-by-ref. This
> would explain your results and it would mean that your example is not
> representative at all.
>
> I don't know if it is possible, but in this case it would be nice if you
> could modify the ABI so that intervals are passed through registers.
> This would tell if there really is a point in not simply using const
> references.
>
> Best regards,
>
> Guillaume
>
> _______________________________________________
> Std-interval mailing list
> Std-interval at compgeom.poly.edu
> http://compgeom.poly.edu/mailman/listinfo/std-interval
More information about the Std-interval
mailing list