nb_kernel010_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 1,299 行 · 第 1/3 页
S
1,299 行
mov eax, [rdx] mov ebx, [rdx + 4] add qword ptr [rsp + nb010_innerjjnr], 8 ;# advance pointer (unrolled 2) mov rsi, [rbp + nb010_type] mov r12d, [rsi + rax*4] mov r13d, [rsi + rbx*4] shl r12d, 1 shl r13d, 1 mov edi, [rsp + nb010_ntia] add r12d, edi add r13d, edi mov rsi, [rbp + nb010_vdwparam] movlps xmm3, [rsi + r12*4] movhps xmm3, [rsi + r13*4] xorps xmm7, xmm7 movaps xmm0, xmm3 shufps xmm0, xmm7, 136 ;# 10001000 shufps xmm3, xmm7, 221 ;# 11011101 ;# xmm0=c6 ;# xmm3=c12 lea rax, [rax + rax*2] ;# replace jnr with j3 lea rbx, [rbx + rbx*2] mov rdi, [rbp + nb010_pos] ;# load coordinates movlps xmm1, [rdi + rax*4] ;# x1 y1 - - movlps xmm4, [rdi + rbx*4] ;# x2 y2 - - movss xmm5, [rdi + rax*4 + 8] ;# z1 - - - movss xmm7, [rdi + rbx*4 + 8] ;# z2 - - - unpcklps xmm1, xmm4 ;# x1 x2 y1 y2 movhlps xmm2, xmm1 ;# y1 y2 - - unpcklps xmm5, xmm7 ;# z1 z2 - - ;# calc dr subps xmm1, [rsp + nb010_ix] subps xmm2, [rsp + nb010_iy] subps xmm5, [rsp + nb010_iz] ;# store dr in xmm9-xmm11 movaps xmm9, xmm1 movaps xmm10, xmm2 movaps xmm11, xmm5 ;# square it mulps xmm1,xmm1 mulps xmm2,xmm2 mulps xmm5,xmm5 addps xmm1, xmm2 addps xmm1, xmm5 ;# rsq in xmm1 rcpps xmm5, xmm1 ;# 1/x lookup seed in xmm5 movaps xmm6, [rsp + nb010_two] mulps xmm1, xmm5 subps xmm6, xmm1 mulps xmm6, xmm5 ;# xmm6=rinvsq movaps xmm4, xmm6 ;# rinvsq movaps xmm1, xmm6 mulps xmm1, xmm6 ;# rinv4 mulps xmm1, xmm6 ;# rinv6 movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=rinv12 mulps xmm1, xmm0 mulps xmm2, xmm3 movaps xmm5, xmm2 subps xmm5, xmm1 ;# Vvdw=Vvdw12-Vvdw6 mulps xmm1, [rsp + nb010_six] mulps xmm2, [rsp + nb010_twelve] subps xmm2, xmm1 mulps xmm4, xmm2 ;# xmm4=total fscal xorps xmm7, xmm7 movlhps xmm5, xmm7 ;# add potential to Vvdwtot (sum in xmm12) addps xmm12, xmm5 ;# calculate scalar force by multiplying dx/dy/dz with fscal mulps xmm9, xmm4 mulps xmm10, xmm4 mulps xmm11, xmm4 movlhps xmm9, xmm7 movlhps xmm10, xmm7 movlhps xmm11, xmm7 ;# xmm0-xmm2 contains tx-tz (partial force) ;# accumulate i forces addps xmm13, xmm9 addps xmm14, xmm10 addps xmm15, xmm11 mov rsi, [rbp + nb010_faction] ;# the fj's - start by accumulating x & y forces from memory movlps xmm0, [rsi + rax*4] ;# x1 y1 - - movhps xmm0, [rsi + rbx*4] ;# x1 y1 x2 y2 unpcklps xmm9, xmm10 ;# x1 y1 x2 y2 addps xmm0, xmm9 movlps [rsi + rax*4], xmm0 movhps [rsi + rbx*4], xmm0 ;# z forces pshufd xmm8, xmm11, 1 addss xmm11, [rsi + rax*4 + 8] addss xmm8, [rsi + rbx*4 + 8] movss [rsi + rax*4 + 8], xmm11 movss [rsi + rbx*4 + 8], xmm8.nb010_checksingle: mov edx, [rsp + nb010_innerk] and edx, 1 jnz .nb010_dosingle jmp .nb010_updateouterdata.nb010_dosingle: mov rcx, [rsp + nb010_innerjjnr] mov eax, [rcx] mov rsi, [rbp + nb010_type] mov r12d, [rsi + rax*4] shl r12d, 1 mov edi, [rsp + nb010_ntia] add r12d, edi mov rsi, [rbp + nb010_vdwparam] movss xmm0, [rsi + r12*4] movss xmm3, [rsi + r12*4 + 4] ;# xmm0=c6 ;# xmm3=c12 lea rax, [rax + rax*2] ;# replace jnr with j3 mov rdi, [rbp + nb010_pos] ;# load coordinates movss xmm1, [rdi + rax*4] movss xmm2, [rdi + rax*4 + 4] movss xmm5, [rdi + rax*4 + 8] ;# calc dr subss xmm1, [rsp + nb010_ix] subss xmm2, [rsp + nb010_iy] subss xmm5, [rsp + nb010_iz] ;# store dr in xmm9-xmm11 movaps xmm9, xmm1 movaps xmm10, xmm2 movaps xmm11, xmm5 ;# square it mulss xmm1,xmm1 mulss xmm2,xmm2 mulss xmm5,xmm5 addss xmm1, xmm2 addss xmm1, xmm5 ;# rsq in xmm1 ;# rsq in xmm4 rcpss xmm5, xmm1 ;# 1/x lookup seed in xmm5 movaps xmm6, [rsp + nb010_two] mulss xmm1, xmm5 subss xmm6, xmm1 mulss xmm6, xmm5 ;# xmm6=rinvsq movaps xmm4, xmm6 ;# rinvsq movaps xmm1, xmm6 mulss xmm1, xmm6 ;# rinv4 mulss xmm1, xmm6 ;# rinv6 movaps xmm2, xmm1 mulss xmm2, xmm2 ;# xmm2=rinv12 mulss xmm1, xmm0 mulss xmm2, xmm3 movaps xmm5, xmm2 subss xmm5, xmm1 ;# Vvdw=Vvdw12-Vvdw6 mulss xmm1, [rsp + nb010_six] mulss xmm2, [rsp + nb010_twelve] subss xmm2, xmm1 mulss xmm4, xmm2 ;# xmm4=total fscal ;# add potential to Vvdwtot (sum in xmm12) addss xmm12, xmm5 ;# calculate scalar force by multiplying dx/dy/dz with fscal mulss xmm9, xmm4 mulss xmm10, xmm4 mulss xmm11, xmm4 ;# xmm0-xmm2 contains tx-tz (partial force) ;# accumulate i forces addss xmm13, xmm9 addss xmm14, xmm10 addss xmm15, xmm11 mov rsi, [rbp + nb010_faction] ;# add to j forces addss xmm9, [rsi + rax*4] addss xmm10, [rsi + rax*4 + 4] addss xmm11, [rsi + rax*4 + 8] movss [rsi + rax*4], xmm9 movss [rsi + rax*4 + 4], xmm10 movss [rsi + rax*4 + 8], xmm11 .nb010_updateouterdata: mov ecx, [rsp + nb010_ii3] mov rdi, [rbp + nb010_faction] mov rsi, [rbp + nb010_fshift] mov edx, [rsp + nb010_is3] ;# accumulate i forces in xmm13, xmm14, xmm15 movhlps xmm0, xmm13 movhlps xmm1, xmm14 movhlps xmm2, xmm15 addps xmm0, xmm13 addps xmm1, xmm14 addps xmm2, xmm15 movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 shufps xmm3, xmm3, 1 shufps xmm4, xmm4, 1 shufps xmm5, xmm5, 1 addss xmm0, xmm3 addss xmm1, xmm4 addss xmm2, xmm5 ;# xmm0-xmm2 has single force in pos0 ;# increment i force movss xmm3, [rdi + rcx*4] movss xmm4, [rdi + rcx*4 + 4] movss xmm5, [rdi + rcx*4 + 8] subss xmm3, xmm0 subss xmm4, xmm1 subss xmm5, xmm2 movss [rdi + rcx*4], xmm3 movss [rdi + rcx*4 + 4], xmm4 movss [rdi + rcx*4 + 8], xmm5 ;# increment fshift force movss xmm3, [rsi + rdx*4] movss xmm4, [rsi + rdx*4 + 4] movss xmm5, [rsi + rdx*4 + 8] subss xmm3, xmm0 subss xmm4, xmm1 subss xmm5, xmm2 movss [rsi + rdx*4], xmm3 movss [rsi + rdx*4 + 4], xmm4 movss [rsi + rdx*4 + 8], xmm5 ;# get n from stack mov esi, [rsp + nb010_n] ;# get group index for i particle mov rdx, [rbp + nb010_gid] ;# base of gid[] mov edx, [rdx + rsi*4] ;# ggid=gid[n] ;# accumulate total potential energy and update it ;# accumulate movhlps xmm6, xmm12 addps xmm12, xmm6 ;# pos 0-1 in xmm12 have the sum now movaps xmm6, xmm12 shufps xmm6, xmm6, 1 addss xmm12, xmm6 ;# add earlier value from mem mov rax, [rbp + nb010_Vvdw] addss xmm12, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm12 ;# finish if last mov ecx, [rsp + nb010_nn1] ;# esi already loaded with n inc esi sub ecx, esi jz .nb010_outerend ;# not last, iterate outer loop once more! mov [rsp + nb010_n], esi jmp .nb010_outer.nb010_outerend: ;# check if more outer neighborlists remain mov ecx, [rsp + nb010_nri] ;# esi already loaded with n above sub ecx, esi jz .nb010_end ;# non-zero, do one more workunit jmp .nb010_threadloop.nb010_end: emms mov eax, [rsp + nb010_nouter] mov ebx, [rsp + nb010_ninner] mov rcx, [rbp + nb010_outeriter] mov rdx, [rbp + nb010_inneriter] mov [rcx], eax mov [rdx], ebx add rsp, 392 pop r15 pop r14 pop r13 pop r12 pop rbx pop rbp ret .globl nb_kernel010nf_x86_64_sse.globl _nb_kernel010nf_x86_64_ssenb_kernel010nf_x86_64_sse: _nb_kernel010nf_x86_64_sse: ;# Room for return address and rbp (16 bytes).equiv nb010nf_fshift, 16.equiv nb010nf_gid, 24.equiv nb010nf_pos, 32.equiv nb010nf_faction, 40.equiv nb010nf_charge, 48.equiv nb010nf_p_facel, 56.equiv nb010nf_argkrf, 64.equiv nb010nf_argcrf, 72.equiv nb010nf_Vc, 80.equiv nb010nf_type, 88.equiv nb010nf_p_ntype, 96.equiv nb010nf_vdwparam, 104.equiv nb010nf_Vvdw, 112.equiv nb010nf_p_tabscale, 120.equiv nb010nf_VFtab, 128.equiv nb010nf_invsqrta, 136.equiv nb010nf_dvda, 144.equiv nb010nf_p_gbtabscale, 152.equiv nb010nf_GBtab, 160.equiv nb010nf_p_nthreads, 168.equiv nb010nf_count, 176.equiv nb010nf_mtx, 184.equiv nb010nf_outeriter, 192.equiv nb010nf_inneriter, 200.equiv nb010nf_work, 208 ;# The mutex (last arg) is not used in assembly. ;# stack offsets for local variables ;# bottom of stack is cache-aligned for sse use .equiv nb010nf_ix, 0.equiv nb010nf_iy, 16.equiv nb010nf_iz, 32.equiv nb010nf_two, 48.equiv nb010nf_c6, 64.equiv nb010nf_c12, 80.equiv nb010nf_Vvdwtot, 96.equiv nb010nf_half, 112.equiv nb010nf_three, 128.equiv nb010nf_nri, 144.equiv nb010nf_iinr, 152.equiv nb010nf_jindex, 160.equiv nb010nf_jjnr, 168.equiv nb010nf_shift, 176.equiv nb010nf_shiftvec, 184.equiv nb010nf_innerjjnr, 192.equiv nb010nf_facel, 200.equiv nb010nf_ntia, 208.equiv nb010nf_innerk, 216.equiv nb010nf_is3, 220.equiv nb010nf_ii3, 224.equiv nb010nf_n, 228.equiv nb010nf_nn1, 232.equiv nb010nf_ntype, 236.equiv nb010nf_nouter, 240.equiv nb010nf_ninner, 244 push rbp mov rbp, rsp push rbx sub rsp, 264 ; # local variable stack space (n*16+8) emms ;# zero 32-bit iteration counters mov eax, 0 mov [rsp + nb010nf_nouter], eax mov [rsp + nb010nf_ninner], eax mov edi, [rdi] mov [rsp + nb010nf_nri], edi mov [rsp + nb010nf_iinr], rsi mov [rsp + nb010nf_jindex], rdx mov [rsp + nb010nf_jjnr], rcx mov [rsp + nb010nf_shift], r8 mov [rsp + nb010nf_shiftvec], r9 mov rdi, [rbp + nb010nf_p_ntype] mov edi, [rdi] mov [rsp + nb010nf_ntype], edi ;# create constant floating-point factors on stack mov eax, 0x40000000 ;# 2.0 in IEEE (hex) mov [rsp + nb010nf_two], eax movss xmm1, [rsp + nb010nf_two] shufps xmm1, xmm1, 0 ;# splat to all elements movaps [rsp + nb010nf_two], xmm1.nb010nf_threadloop: mov rsi, [rbp + nb010nf_count] ;# pointer to sync counter mov eax, [rsi].nb010nf_spinlock: mov ebx, eax ;# ebx=*count=nn0 add ebx, 1 ;# ebx=nn1=nn0+10 lock cmpxchg [esi], ebx ;# write nn1 to *counter, ;# if it hasnt changed. ;# or reread *counter to eax. pause ;# -> better p4 performance jnz .nb010nf_spinlock
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?