Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.os.linux.advocacy > #289192

For Ezekilel ,multi-threaded version

From Melzzzzz <mel@zzzzz.com>
Newsgroups comp.os.linux.advocacy
Subject For Ezekilel ,multi-threaded version
Date 2015-04-12 10:36 +0200
Organization albasani.net
Message-ID <20150412103621.3c2c0560@maxa-pc> (permalink)

Show all headers | View raw


Look at this one, I wrote it yesterday  ;)


format ELF64 executable 3

STACKSIZE = 4096
NUMTHREADS = 4

FUTEX_WAIT   equ           0  
FUTEX_WAKE   equ           1  
FUTEX_PRIVATE_FLAG equ     128

STDIN equ 0
STDOUT equ 1
STDERR equ 2
WIDTH equ 60
BFACT = 32768
LINEBUFFSIZ = WIDTH*BFACT

macro futex_acquire sema{
        local .L0,.L1
        mov r15,sema 
.L0:
        mov ebx,1
        xor eax,eax
        lock cmpxchg [r15],ebx
        test eax,eax
        jz .L1
        mov eax, 202
        mov rdi, r15
        mov rsi, FUTEX_WAIT or FUTEX_PRIVATE_FLAG
        mov edx, 1
        xor r10,r10
        syscall
        jmp .L0
.L1:
} 

macro futex_release sema{
        lock and dword[sema],0
        mov eax,202
        mov rdi, sema
        mov rsi, FUTEX_WAKE or FUTEX_PRIVATE_FLAG
        mov rdx,1
        syscall  
}

CLONE_VM                equ 0x00000100
CLONE_FS                equ 0x00000200
CLONE_FILES             equ 0x00000400
CLONE_SIGHAND   equ 0x00000800
CLONE_THREAD    equ 0x00010000

macro sys_clone stack{
        mov eax,56 ; sys_clone
        mov rdi,CLONE_VM or CLONE_FS or CLONE_FILES \
        or CLONE_SIGHAND or CLONE_THREAD;
        mov rsi,stack ; choose stack
        syscall
}

macro sys_exit_group err{
        mov eax,231
        mov rdi,err
        syscall
}


struc timespec tv_sec,tv_nsec{
.tv_sec  dq tv_sec ; seconds  
.tv_nsec dq tv_nsec ; nanoseconds (it must be in range 0 to 999999999)
}

macro sys_nanosleep spec{
        mov eax, 35
        mov rdi, spec
        xor esi,esi  
	syscall
}
                                 
struc aminoacid{
	.p dd ?
	.c db ?
	.filler db 3 dup(?)
}

macro sys_exit err {
	mov eax,60
	mov rdi,err
	syscall
}

macro sys_write fd, buf, size {
	mov eax,1
	mov rdi, fd
	mov rsi, buf
	mov rdx, size
	syscall
}

macro rand max{
IM = 139968
IA = 3877
IC = 29573
; r12 hold multiply value
	xor edx,edx
	mov eax,r14d
	imul eax,IA
	add eax, IC
	mov esi,eax
	mul r12d
	shr edx,14
	imul edx,IM
	sub esi,edx
	mov r14d,esi
	cvtsi2ss xmm0,esi
	mulss xmm0,[RCP]
}

virtual at 0
	amino aminoacid
end virtual

entry main

segment executable
main:
	cmp qword[rsp],2
	jl .begin
	mov rdi,[rsp+16] ; argv[1]
	call a2qw
	mov [count],rax
.begin:
	call start_threads
	mov rbx,iub
	mov rcx,iublen
	call acumulate_probabilities
	mov rbx,homosapiens
	mov rcx,homosapienslen
	call acumulate_probabilities

	sys_write STDOUT,hsalu,hsalusz
	mov rax, alusz
	mov rbx, alu
	mov rdx,[count]
	imul rdx,2
	call repeat_fasta

	sys_write STDOUT,IUB,IUBsz
	mov rbx, iub
	mov rcx, iublen
	mov rdx, [count]
	imul rdx,3
	call random_fasta

	sys_write STDOUT,hsf,hsfsz
	mov rbx, homosapiens
	mov rcx, homosapienslen
	mov rdx, [count]
	imul rdx,5
	call random_fasta
	sys_exit_group 0

start_threads:
	mov r12,NUMTHREADS
	mov rbx,stacks+STACKSIZE
	sys_clone rbx
	test eax,eax
	jnz .L00
	call write_thread
	sys_exit 0
.L00:
	add rbx,STACKSIZE
.L0:
	sys_clone rbx
	test eax,eax
	jnz .parent
	call worker_thread
	sys_exit 0
.parent:
	add rbx,STACKSIZE
	dec r12
	jnz .L0
	ret	

write_thread:
.L0:
	futex_acquire write_mutex
	mov rsi,genbuf
	call write_buf
	futex_release done_mutex
	jmp .L0
	ret

worker_thread:
	mov rbp,rsp
.L0:
	xor r14,r14
	futex_acquire mutex	
	sub rsp,4
	mov ebx,[bufbegin]
	mov [rsp],ebx
	add ebx,4000
.L00:
	cmp ebx,[bufend]
	jg .L000
	mov [bufbegin],ebx
	mov r14,4000
	jmp .L01
.L000:
	sub ebx,[bufend]
	mov r14,4000
	sub r14,rbx
	test r14,r14
	jz .continue
	mov r8d,[bufend]
	mov [bufbegin],r8d
.L01:
	inc [fchunk]
	mov ebx,[rsp]
	futex_release mutex
.L02:
	dec r14
	mov r12,[dna]
	mov r13,[dnasize]
	movss xmm0,[rndbuf+rbx*4]
	xor rdx,rdx
	xor rax,rax
	shufps xmm0,xmm0,0
.L1:
	cmp r13,4
	jl .L2
	movaps xmm1,xmm0
	pinsrd xmm2,[r12+rax+amino.p],0
	pinsrd xmm2,[r12+rax+amino.p+8],1
	pinsrd xmm2,[r12+rax+amino.p+16],2
	pinsrd xmm2,[r12+rax+amino.p+24],3
	cmpnltps xmm1,xmm2
	movmskps r11,xmm1
	popcnt r11,r11
	add rdx,r11
	add rax,32
	sub r13,4
	jnz .L1
	jmp .L21
.L2:
	ucomiss xmm0,[r12+rax+amino.p]
	sbb r11,r11
	lea rdx,[rdx+r11+1]
	dec r13
	jz .L21
	ucomiss xmm0,[r12+rax+amino.p+8]
	sbb r11,r11
	lea rdx,[rdx+r11+1]
	dec r13
	jz .L21
	ucomiss xmm0,[r12+rax+amino.p+16]
	sbb r11,r11
	lea rdx,[rdx+r11+1]
.L21:	
	mov sil,[r12+rdx*8+amino.c]
	mov [genbuf+rbx],sil
	inc ebx
	test r14,r14
	jnz .L02
	futex_acquire mutex	
	dec [fchunk]
	futex_release mutex
	mov rsp,rbp
	jmp .L0
.continue:
	mov rsp,rbp
	futex_release mutex
	futex_release wait_mutex
;	sys_nanosleep myspec
	jmp .L0
	ret
; rcx len, rbx aminoacid buffer
acumulate_probabilities:
	pxor xmm0,xmm0
.L0:
	addss xmm0,[rbx+amino.p]
	movss [rbx+amino.p],xmm0
	add rbx,8
	dec rcx
	jnz .L0
	ret
	
; rax buffer size, rbx input buffer, rdx count
repeat_fasta:
	mov [wbufbegin],dword 0
	mov r12,rdx
	mov r14,rax
	xor r15,r15
.L00:
	xor r13,r13
.L0:
	mov r8b,[rbx+r15]
	mov [genbuf+r13],r8b
	dec r12
	inc r15
	inc r13
	cmp r13,LINEBUFFSIZ
	jz .flush
	xor eax,eax
	cmp r15,r14
	cmove r15,rax
	test r12,r12
	jnz .L0
.flush:
	mov [wbufend],r13d
	mov rsi,genbuf
	call write_buf
	test r12,r12
	jnz .L00
	ret

; rbx input buffer, rcx buflen, rdx count
random_fasta:
;	mov r12,4318579316753219217
	mov r12d,502748801
	mov r13,rdx
	mov r14d,[last]
	mov [dna],rbx
	mov [dnasize],rcx
	mov [bufend],dword LINEBUFFSIZ
.L0:
	test r13,r13
	jz .exit1
	mov [bufbegin],dword 0
	xor ebx,ebx
.L1:
	rand 1.0
	movss [rndbuf+rbx*4],xmm0
	dec r13
	jz .exit
.L2:
	inc ebx
	cmp ebx,[bufend]
	jnz .L1
	jmp .L3
.exit:
	inc ebx
	mov [bufend],ebx
.L3:
	futex_acquire done_mutex
.L30:
	futex_release mutex
	futex_acquire wait_mutex
	futex_acquire mutex
	mov [wait_mutex],dword 1
	cmp [fchunk],dword 0
	jz .L4
	jmp .L30
.L4:
	mov ebx,[bufbegin]
	cmp ebx,[bufend]
	jz .write
	jmp .L30
.write:
	mov [wbufbegin],dword 0
	mov ebx,[bufend]
	mov [wbufend],ebx
	futex_release write_mutex
	mov [bufend],dword LINEBUFFSIZ
	jmp .L0
.exit1:
	mov [last],r14d
	futex_acquire done_mutex
	mov [done_mutex],dword 0
	ret
; rax qw to convert, rdi output buf returns rcx bufsz
qw2a:
	lea r10 , [rsp-1]
	xor rcx,rcx
	mov r8,10
.L0:
	xor rdx,rdx
	div r8
	mov r9b,[table+rdx]
	mov [r10],r9b
	dec r10
	inc rcx
	test rax,rax
	jnz .L0
	
	lea rsi,[r10+1]
	cld
.L1:
	movsb
	cmp rsi,rsp
	jne .L1
	
	ret
; rdi input buf (null terminated), return rax digit
a2qw:
	cld
	xor eax,eax
	mov rcx,20
	repne scasb
	sub rdi,2
	inc rcx
	mov rdx,1
.L0:
	xor ebx,ebx
	mov bl,byte [rdi]
	sub bl,0x30
	imul rbx,rdx
	add rax, rbx
	imul rdx,10
	dec rdi
	inc rcx
	cmp rcx,20
	jne .L0
	ret
; rsi buf
write_buf:
	mov rdi,outbuf
	mov ecx,[wbufbegin]
	lea rsi,[rsi+rcx]
	mov r11d,[wbufend]
	sub r11d,[wbufbegin]
	xor r10,r10
	mov ecx,WIDTH
	cld
.L0:
	test r11,r11
	jz .L1
.L00:
	cmp r11,WIDTH
	jl .L01
	rep movsb
	add r10,WIDTH
	sub r11,WIDTH
	jmp .L1
.L01:
	mov ecx,r11d
	rep movsb
	add r10,r11
	xor r11,r11
.L1:
	mov byte[rdi],0xa
	inc rdi
	inc r10
	mov ecx,WIDTH
	test r11,r11
	jnz .L00
.L2:
	sys_write STDOUT,outbuf,r10
	ret
	
segment readable writeable
align 32
iub	dd 0.27
	db 'a',0,0,0
	
	dd 0.12 
	db 'c',0,0,0
	
	dd 0.12
	db 'g',0,0,0
	
	dd 0.27
	db 't',0,0,0
	
	dd 0.02
	db 'B',0,0,0
	
	dd 0.02
	db 'D',0,0,0
	
	dd 0.02
	db 'H',0,0,0
	
	dd 0.02
	db 'K',0,0,0
	
	dd 0.02
	db 'M',0,0,0
	
	dd 0.02
	db 'N',0,0,0
	
	dd 0.02
	db 'R',0,0,0
	
	dd 0.02
	db 'S',0,0,0
	
	dd 0.02
	db 'V',0,0,0
	
	dd 0.02
	db 'W',0,0,0
	
	dd 0.02
	db 'Y',0,0,0
iublen = ($-iub) / 8

homosapiens dd 0.3029549426680
	db 'a' ,0,0,0
	dd 0.1979883004921
	db 'c' ,0,0,0
	dd 0.1975473066391
	db 'g' ,0,0,0
	dd 0.3015094502008 
	db 't' ,0,0,0
homosapienslen = ($-homosapiens) / 8
	
hsalu db '>ONE Homo sapiens alu',0xa
hsalusz = $-hsalu
IUB db '>TWO IUB ambiguity codes',0xa
IUBsz = $-IUB
hsf db '>THREE Homo sapiens frequency',0xa
hsfsz = $-hsf
table db '0123456789'
alu db 'GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG'
    db 'GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA'
    db 'CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT'
    db 'ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA'
    db 'GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG'
    db 'AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC'
    db 'AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA'
alusz = $-alu
align 8
count dq 1
last dd 42
bufbegin dd LINEBUFFSIZ
bufend dd LINEBUFFSIZ
wbufbegin dd LINEBUFFSIZ
wbufend dd LINEBUFFSIZ
mutex dd 1
wait_mutex dd 1
write_mutex dd 1
done_mutex dd 0
;RCP dd 921680564; 1/139968
RCP dd 0.00000714449017; 1/139968
fchunk dd 0
myspec timespec 0,1

align 8
dna rq 1
dnasize rq 1

rndbuf rd LINEBUFFSIZ

genbuf rb LINEBUFFSIZ
outbuf rb LINEBUFFSIZ+BFACT

align 16
stacks rb (NUMTHREADS+1)*STACKSIZE

Back to comp.os.linux.advocacy | Previous | Next — Next in thread | Find similar | Unroll thread


Thread

For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-12 10:36 +0200
  Re: For Ezekilel ,multi-threaded version Chris Ahlstrom <OFeem1987@teleworm.us> - 2015-04-12 06:45 -0400
    Re: For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-12 17:21 +0200
      Re: For Ezekilel ,multi-threaded version GreyCloud <mist@cumulus.com> - 2015-04-12 12:56 -0600
        Re: For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-12 21:08 +0200
          Re: For Ezekilel ,multi-threaded version GreyCloud <mist@cumulus.com> - 2015-04-12 14:44 -0600
            Re: For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-12 22:47 +0200
              Re: For Ezekilel ,multi-threaded version Peter Köhlmann <peter-koehlmann@t-online.de> - 2015-04-12 23:42 +0200
                Re: For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-13 05:25 +0200
                Re: For Ezekilel ,multi-threaded version Peter Köhlmann <peter-koehlmann@t-online.de> - 2015-04-13 09:37 +0200
                Re: For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-13 11:51 +0200
                Re: For Ezekilel ,multi-threaded version -hh <recscuba_google@huntzinger.com> - 2015-04-13 08:30 -0700
                Re: For Ezekilel ,multi-threaded version Steve Carroll <fretwizzer@gmail.com> - 2015-04-13 09:11 -0700
                Re: For Ezekilel ,multi-threaded version Slimer <slvrslmr@lv.c> - 2015-04-13 08:55 -0400
    Re: For Ezekilel ,multi-threaded version taka0038@gmail.com - 2015-04-12 08:40 -0700
      Ezekiel, multi-threaded moron Chris Ahlstrom <OFeem1987@teleworm.us> - 2015-04-12 13:10 -0400
        Re: Ezekiel, multi-threaded moron GreyCloud <mist@cumulus.com> - 2015-04-12 12:55 -0600
          Re: Christopher John Ahlstrom - moronic cock wiping  pansy "Ezekiel" <zeke@nosuchemail.com> - 2015-04-13 11:06 -0400
  Re: For Ezekilel ,multi-threaded version DFS <nospam@dfs.com> - 2015-04-12 13:22 -0400
    Re: For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-12 19:35 +0200
    Re: For Ezekilel ,multi-threaded version owl <owl@rooftop.invalid> - 2015-04-12 17:45 +0000
  Re: For Ezekilel ,multi-threaded version Melzzzzz <mel@zzzzz.com> - 2015-04-13 05:23 +0200

csiph-web