[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