Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Development mailing list

From: Gleb Natapov (glebn_at_[hidden])
Date: 2007-03-06 05:55:42


On Tue, Mar 06, 2007 at 11:24:06AM +0100, Bert Wesarg wrote:
> Hello,
>
> Gleb Natapov wrote:
> > If it does this after opal_atomic_lock() (which is explicit memory
> > barrier) then it is broken.
> Than, gcc 4.1.1 on the amd64 architecture is broken:
And can you repeat the test please, but make "test" variable to be global
to tell compiler that it can be actually accessed by more then one
thread.

>
> The test-cases were compiled in the test/asm directory, with -O3
>
> Bert
>
>

> #define OMPI_BUILDING 0
> #include "ompi_config.h"
>
> #include "opal/sys/atomic.h"
>
> static opal_atomic_lock_t lock = { { OPAL_ATOMIC_UNLOCKED } };
>
> int
> main(int argc, char *argv[])
> {
> int test = (argc == 1);
>
> __asm__ ("# first if\n");
> if (1 == test) {
> return 1;
> }
> __asm__ ("# lock\n");
> opal_atomic_lock(&lock);
>
> __asm__ ("# second if\n");
> if (1 == test) {
> __asm__ ("# if unlock\n");
> opal_atomic_unlock(&lock);
> return 2;
> }
>
> test = 1;
> __asm__ ("# unlock\n");
> opal_atomic_unlock(&lock);
>
> return 0;
> }
>

> .file "double_check.c"
> .text
> .p2align 4,,15
> .globl main
> .type main, @function
> main:
> .LFB30:
> #APP
> # first if
>
> #NO_APP
> decl %edi
> movl $1, %eax
> je .L4
> #APP
> # lock
>
> .p2align 4,,7
> #NO_APP
> .L5:
> xorl %edx, %edx
> movl $1, %ecx
> movl %edx, %eax
> #APP
> lock; cmpxchgl %ecx,lock(%rip)
> sete %dl
>
> #NO_APP
> testb %dl, %dl
> jne .L13
> .p2align 4,,7
> .L9:
> movl lock(%rip), %eax
> decl %eax
> je .L9
> jmp .L5
> .L13:
> #APP
> # second if
>
> # unlock
>
> #NO_APP
> movl $0, lock(%rip)
> .L4:
> rep ; ret
> .LFE30:
> .size main, .-main
> .local lock
> .comm lock,4,4
> .section .eh_frame,"a",@progbits
> .Lframe1:
> .long .LECIE1-.LSCIE1
> .LSCIE1:
> .long 0x0
> .byte 0x1
> .string "zR"
> .uleb128 0x1
> .sleb128 -8
> .byte 0x10
> .uleb128 0x1
> .byte 0x3
> .byte 0xc
> .uleb128 0x7
> .uleb128 0x8
> .byte 0x90
> .uleb128 0x1
> .align 8
> .LECIE1:
> .LSFDE1:
> .long .LEFDE1-.LASFDE1
> .LASFDE1:
> .long .LASFDE1-.Lframe1
> .long .LFB30
> .long .LFE30-.LFB30
> .uleb128 0x0
> .align 8
> .LEFDE1:
> .ident "GCC: (GNU) 4.1.1"
> .section .note.GNU-stack,"",@progbits

> #define OMPI_BUILDING 0
> #include "ompi_config.h"
>
> #include "opal/sys/atomic.h"
>
> static opal_atomic_lock_t lock = { { OPAL_ATOMIC_UNLOCKED } };
>
> int
> main(int argc, char *argv[])
> {
> volatile int test = (argc == 1);
>
> __asm__ ("# first if\n");
> if (1 == test) {
> return 1;
> }
> __asm__ ("# lock\n");
> opal_atomic_lock(&lock);
>
> __asm__ ("# second if\n");
> if (1 == test) {
> __asm__ ("# if unlock\n");
> opal_atomic_unlock(&lock);
> return 2;
> }
>
> test = 1;
> __asm__ ("# unlock\n");
> opal_atomic_unlock(&lock);
>
> return 0;
> }
>

> .file "double_check_volatile.c"
> .text
> .p2align 4,,15
> .globl main
> .type main, @function
> main:
> .LFB30:
> xorl %eax, %eax
> cmpl $1, %edi
> sete %al
> movl %eax, -4(%rsp)
> #APP
> # first if
>
> #NO_APP
> movl -4(%rsp), %eax
> movl $1, %edx
> decl %eax
> je .L4
> #APP
> # lock
>
> .p2align 4,,7
> #NO_APP
> .L5:
> xorl %edx, %edx
> movl $1, %ecx
> movl %edx, %eax
> #APP
> lock; cmpxchgl %ecx,lock(%rip)
> sete %dl
>
> #NO_APP
> testb %dl, %dl
> jne .L15
> .p2align 4,,7
> .L11:
> movl lock(%rip), %eax
> decl %eax
> je .L11
> jmp .L5
> .L15:
> #APP
> # second if
>
> #NO_APP
> movl -4(%rsp), %eax
> decl %eax
> jne .L8
> #APP
> # if unlock
>
> #NO_APP
> movl $0, lock(%rip)
> movl $2, %edx
> .L4:
> movl %edx, %eax
> ret
> .L8:
> movl $1, -4(%rsp)
> #APP
> # unlock
>
> #NO_APP
> xorl %edx, %edx
> movl $0, lock(%rip)
> jmp .L4
> .LFE30:
> .size main, .-main
> .local lock
> .comm lock,4,4
> .section .eh_frame,"a",@progbits
> .Lframe1:
> .long .LECIE1-.LSCIE1
> .LSCIE1:
> .long 0x0
> .byte 0x1
> .string "zR"
> .uleb128 0x1
> .sleb128 -8
> .byte 0x10
> .uleb128 0x1
> .byte 0x3
> .byte 0xc
> .uleb128 0x7
> .uleb128 0x8
> .byte 0x90
> .uleb128 0x1
> .align 8
> .LECIE1:
> .LSFDE1:
> .long .LEFDE1-.LASFDE1
> .LASFDE1:
> .long .LASFDE1-.Lframe1
> .long .LFB30
> .long .LFE30-.LFB30
> .uleb128 0x0
> .align 8
> .LEFDE1:
> .ident "GCC: (GNU) 4.1.1"
> .section .note.GNU-stack,"",@progbits

> _______________________________________________
> devel mailing list
> devel_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/devel

--
			Gleb.