Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.os.linux.advocacy > #289192
| 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) |
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
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