nb_kernel410_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,011 行 · 第 1/4 页
S
2,011 行
mulss xmm9, xmm0 ;# (12*vnb12-6*vnb6)*rinv mov rsi, [rbp + nb410_dvda] ;# Calculate dVda xorps xmm7, xmm7 mulss xmm3, [rsp + nb410_gbscale] movaps xmm6, xmm3 mulss xmm6, [rsp + nb410_r] addss xmm6, xmm5 ;# increment vctot (sum in xmm12) addss xmm12, xmm5 ;# xmm6=(vcoul+fijC*r) subss xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addss xmm7, [rsp + nb410_dvdasum] movss [rsp + nb410_dvdasum], xmm7 ;# update j atoms dvdaj addss xmm6, [rsi + rax*4] movss [rsi + rax*4], xmm6 subss xmm9, xmm3 mulss xmm9, xmm0 ;# fscal movaps xmm10, xmm9 movaps xmm11, xmm9 mulss xmm9, [rsp + nb410_dx] mulss xmm10, [rsp + nb410_dy] mulss xmm11, [rsp + nb410_dz] ;# accumulate i forces addss xmm13, xmm9 addss xmm14, xmm10 addss xmm15, xmm11 mov rsi, [rbp + nb410_faction] ;# add to j forces addss xmm9, [rsi + r8*4] addss xmm10, [rsi + r8*4 + 4] addss xmm11, [rsi + r8*4 + 8] movss [rsi + r8*4], xmm9 movss [rsi + r8*4 + 4], xmm10 movss [rsi + r8*4 + 8], xmm11 .nb410_updateouterdata: mov ecx, [rsp + nb410_ii3] mov rdi, [rbp + nb410_faction] mov rsi, [rbp + nb410_fshift] mov edx, [rsp + nb410_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 + nb410_n] ;# get group index for i particle mov rdx, [rbp + nb410_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 + nb410_Vc] addss xmm12, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm12 ;# accumulate total lj energy and update it movaps xmm7, [rsp + nb410_Vvdwtot] ;# accumulate movhlps xmm6, xmm7 addps xmm7, xmm6 ;# pos 0-1 in xmm7 have the sum now movaps xmm6, xmm7 shufps xmm6, xmm6, 1 addss xmm7, xmm6 ;# add earlier value from mem mov rax, [rbp + nb410_Vvdw] addss xmm7, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm7 ;# accumulate dVda and update it movaps xmm7, [rsp + nb410_dvdasum] ;# accumulate movhlps xmm6, xmm7 addps xmm7, xmm6 ;# pos 0-1 in xmm7 have the sum now movaps xmm6, xmm7 shufps xmm6, xmm6, 1 addss xmm7, xmm6 mov edx, [rsp + nb410_ii] mov rax, [rbp + nb410_dvda] addss xmm7, [rax + rdx*4] movss [rax + rdx*4], xmm7 ;# finish if last mov ecx, [rsp + nb410_nn1] ;# esi already loaded with n inc esi sub ecx, esi jz .nb410_outerend ;# not last, iterate outer loop once more! mov [rsp + nb410_n], esi jmp .nb410_outer.nb410_outerend: ;# check if more outer neighborlists remain mov ecx, [rsp + nb410_nri] ;# esi already loaded with n above sub ecx, esi jz .nb410_end ;# non-zero, do one more workunit jmp .nb410_threadloop.nb410_end: mov eax, [rsp + nb410_nouter] mov ebx, [rsp + nb410_ninner] mov rcx, [rbp + nb410_outeriter] mov rdx, [rbp + nb410_inneriter] mov [rcx], eax mov [rdx], ebx add rsp, 568 emms pop r15 pop r14 pop r13 pop r12 pop rbx pop rbp ret.globl nb_kernel410nf_x86_64_sse.globl _nb_kernel410nf_x86_64_ssenb_kernel410nf_x86_64_sse: _nb_kernel410nf_x86_64_sse: ;# Room for return address and rbp (16 bytes).equiv nb410nf_fshift, 16.equiv nb410nf_gid, 24.equiv nb410nf_pos, 32.equiv nb410nf_faction, 40.equiv nb410nf_charge, 48.equiv nb410nf_p_facel, 56.equiv nb410nf_argkrf, 64.equiv nb410nf_argcrf, 72.equiv nb410nf_Vc, 80.equiv nb410nf_type, 88.equiv nb410nf_p_ntype, 96.equiv nb410nf_vdwparam, 104.equiv nb410nf_Vvdw, 112.equiv nb410nf_p_tabscale, 120.equiv nb410nf_VFtab, 128.equiv nb410nf_invsqrta, 136.equiv nb410nf_dvda, 144.equiv nb410nf_p_gbtabscale, 152.equiv nb410nf_GBtab, 160.equiv nb410nf_p_nthreads, 168.equiv nb410nf_count, 176.equiv nb410nf_mtx, 184.equiv nb410nf_outeriter, 192.equiv nb410nf_inneriter, 200.equiv nb410nf_work, 208 ;# stack offsets for local variables ;# bottom of stack is cache-aligned for sse use .equiv nb410nf_ix, 0.equiv nb410nf_iy, 16.equiv nb410nf_iz, 32.equiv nb410nf_iq, 48.equiv nb410nf_gbtsc, 64.equiv nb410nf_qq, 80.equiv nb410nf_c6, 96.equiv nb410nf_c12, 112.equiv nb410nf_vctot, 128.equiv nb410nf_Vvdwtot, 144.equiv nb410nf_half, 160.equiv nb410nf_three, 176.equiv nb410nf_isai, 192.equiv nb410nf_isaprod, 208.equiv nb410nf_gbscale, 224.equiv nb410nf_nri, 240.equiv nb410nf_iinr, 248.equiv nb410nf_jindex, 256.equiv nb410nf_jjnr, 264.equiv nb410nf_shift, 272.equiv nb410nf_shiftvec, 280.equiv nb410nf_facel, 288.equiv nb410nf_innerjjnr, 296.equiv nb410nf_is3, 304.equiv nb410nf_ii3, 308.equiv nb410nf_ntia, 312.equiv nb410nf_innerk, 316.equiv nb410nf_n, 320.equiv nb410nf_nn1, 324.equiv nb410nf_ntype, 328.equiv nb410nf_nouter, 332.equiv nb410nf_ninner, 336 push rbp mov rbp, rsp push rbx emms push r12 push r13 push r14 push r15 sub rsp, 360 ;# local variable stack space (n*16+8) ;# zero 32-bit iteration counters mov eax, 0 mov [rsp + nb410nf_nouter], eax mov [rsp + nb410nf_ninner], eax mov edi, [rdi] mov [rsp + nb410nf_nri], edi mov [rsp + nb410nf_iinr], rsi mov [rsp + nb410nf_jindex], rdx mov [rsp + nb410nf_jjnr], rcx mov [rsp + nb410nf_shift], r8 mov [rsp + nb410nf_shiftvec], r9 mov rdi, [rbp + nb410nf_p_ntype] mov edi, [rdi] mov [rsp + nb410nf_ntype], edi mov rsi, [rbp + nb410nf_p_facel] movss xmm0, [rsi] movss [rsp + nb410nf_facel], xmm0 mov rbx, [rbp + nb410nf_p_gbtabscale] movss xmm4, [rbx] shufps xmm4, xmm4, 0 movaps [rsp + nb410nf_gbtsc], xmm4 ;# create constant floating-point factors on stack mov eax, 0x3f000000 ;# half in IEEE (hex) mov [rsp + nb410nf_half], eax movss xmm1, [rsp + nb410nf_half] shufps xmm1, xmm1, 0 ;# splat to all elements movaps xmm2, xmm1 addps xmm2, xmm2 ;# one movaps xmm3, xmm2 addps xmm2, xmm2 ;# two addps xmm3, xmm2 ;# three movaps [rsp + nb410nf_half], xmm1 movaps [rsp + nb410nf_three], xmm3.nb410nf_threadloop: mov rsi, [rbp + nb410nf_count] ;# pointer to sync counter mov eax, [rsi].nb410nf_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 .nb410nf_spinlock ;# if(nn1>nri) nn1=nri mov ecx, [rsp + nb410nf_nri] mov edx, ecx sub ecx, ebx cmovle ebx, edx ;# if(nn1>nri) nn1=nri ;# Cleared the spinlock if we got here. ;# eax contains nn0, ebx contains nn1. mov [rsp + nb410nf_n], eax mov [rsp + nb410nf_nn1], ebx sub ebx, eax ;# calc number of outer lists mov esi, eax ;# copy n to esi jg .nb410nf_outerstart jmp .nb410nf_end.nb410nf_outerstart: ;# ebx contains number of outer iterations add ebx, [rsp + nb410nf_nouter] mov [rsp + nb410nf_nouter], ebx.nb410nf_outer: mov rax, [rsp + nb410nf_shift] ;# rax = pointer into shift[] mov ebx, [rax+rsi*4] ;# ebx=shift[n] lea rbx, [rbx + rbx*2] ;# rbx=3*is mov [rsp + nb410nf_is3],ebx ;# store is3 mov rax, [rsp + nb410nf_shiftvec] ;# rax = base of shiftvec[] movss xmm0, [rax + rbx*4] movss xmm1, [rax + rbx*4 + 4] movss xmm2, [rax + rbx*4 + 8] mov rcx, [rsp + nb410nf_iinr] ;# rcx = pointer into iinr[] mov ebx, [rcx + rsi*4] ;# ebx =ii mov rdx, [rbp + nb410nf_charge] movss xmm3, [rdx + rbx*4] mulss xmm3, [rsp + nb410nf_facel] shufps xmm3, xmm3, 0 mov rdx, [rbp + nb410nf_invsqrta] ;# load invsqrta[ii] movss xmm4, [rdx + rbx*4] shufps xmm4, xmm4, 0 mov rdx, [rbp + nb410nf_type] mov edx, [rdx + rbx*4] imul edx, [rsp + nb410nf_ntype] shl edx, 1 mov [rsp + nb410nf_ntia], edx lea rbx, [rbx + rbx*2] ;# rbx = 3*ii=ii3 mov rax, [rbp + nb410nf_pos] ;# rax = base of pos[] addss xmm0, [rax + rbx*4] addss xmm1, [rax + rbx*4 + 4] addss xmm2, [rax + rbx*4 + 8] movaps [rsp + nb410nf_iq], xmm3 movaps [rsp + nb410nf_isai], xmm4 shufps xmm0, xmm0, 0 shufps xmm1, xmm1, 0 shufps xmm2, xmm2, 0 movaps [rsp + nb410nf_ix], xmm0 movaps [rsp + nb410nf_iy], xmm1 movaps [rsp + nb410nf_iz], xmm2 mov [rsp + nb410nf_ii3], ebx ;# clear vctot xorps xmm4, xmm4 movaps [rsp + nb410nf_vctot], xmm4 movaps [rsp + nb410nf_Vvdwtot], xmm4 mov rax, [rsp + nb410nf_jindex] mov ecx, [rax + rsi*4] ;# jindex[n] mov edx, [rax + rsi*4 + 4] ;# jindex[n+1] sub edx, ecx ;# number of innerloop atoms mov rsi, [rbp + nb410nf_pos] mov rdi, [rbp + nb410nf_faction] mov rax, [rsp + nb410nf_jjnr] shl ecx, 2 add rax, rcx mov [rsp + nb410nf_innerjjnr], rax ;# pointer to jjnr[nj0] mov ecx, edx sub edx, 4 add ecx, [rsp + nb410nf_ninner] mov [rsp + nb410nf_ninner], ecx add edx, 0 mov [rsp + nb410nf_innerk], edx ;# number of innerloop atoms jge .nb410nf_unroll_loop jmp .nb410nf_finish_inner.nb410nf_unroll_loop: ;# quad-unroll innerloop here mov rdx, [rsp + nb410nf_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] mov ebx, [rdx + 4] mov ecx, [rdx + 8] mov edx, [rdx + 12] ;# eax-edx=jnr1-4 add qword ptr [rsp + nb410nf_innerjjnr], 16 ;# advance pointer (unrolled 4) ;# load isa2 mov rsi, [rbp + nb410nf_invsqrta] movss xmm3, [rsi + rax*4] movss xmm4, [rsi + rcx*4] movss xmm6, [rsi + rbx*4] movss xmm7, [rsi + rdx*4] movaps xmm2, [rsp + nb410nf_isai] shufps xmm3, xmm6, 0 shufps xmm4, xmm7, 0 shufps xmm3, xmm4, 136 ;# 10001000 ;# all charges in xmm3 mulps xmm2, xmm3 movaps [rsp + nb410nf_isaprod], xmm2 movaps xmm1, xmm2 mulps xmm1, [rsp + nb410nf_gbtsc] movaps [rsp + nb410nf_gbscale], xmm1 mov rsi, [rbp + nb410nf_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] movss xmm4, [rsi + rcx*4] movss xmm6, [rsi + rbx*4] movss xmm7, [rsi + rdx*4] mulps xmm2, [rsp + nb410nf_iq] shufps xmm3, xmm6, 0 shufps xmm4, xmm7, 0 shufps xmm3, xmm4, 136 ;# 10001000 ;# all charges in xmm3 mulps xmm3, xmm2 movaps [rsp + nb410nf_qq], xmm3 movd mm0, eax movd mm1, ebx movd mm2, ecx movd mm3, edx mov rsi, [rbp + nb410nf_type] mov eax, [rsi + rax*4] mov ebx, [rsi + rbx*4] mov ecx, [rsi + rcx*4] mov edx, [rsi + rdx*4] mov rsi, [rbp + nb410nf_vdwparam] shl eax, 1 shl ebx, 1 shl ecx, 1 shl edx, 1 mov edi, [rsp + nb410nf_ntia] add eax, edi add ebx, edi add ecx, edi add edx, edi movlps xmm6, [rsi + rax*4] movlps xmm7, [rsi + rcx*4] movhps xmm6, [rsi + rbx*4] movhps xmm7, [rsi + rdx*4] movaps xmm4, xmm6 shufps xmm4, xmm7, 136 ;# 10001000 shufps xmm6, xmm7, 221 ;# 11011101 movd eax, mm0 movd ebx, mm1 movd ecx, mm2 movd edx, mm3 movaps [rsp + nb410nf_c6], xmm4 movaps [rsp + nb410nf_c12], xmm6 mov rsi, [rbp + nb410nf_pos] ;# base of pos[] lea rax, [rax + rax*2] ;# replace jnr with j3 lea rbx, [rbx + rbx*2] lea rcx, [rcx + rcx*2] ;# replace jnr with j3 lea rdx, [rdx + rdx*2] ;# move four coordinates to xmm0-xmm2 movlps xmm4, [rsi + rax*4] movlps xmm5, [rsi + rcx*4] movss xmm2, [rsi + rax*4 + 8] movss xmm6, [rsi + rcx*4 + 8]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?