nb_kernel200_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 1,236 行 · 第 1/3 页
S
1,236 行
.nb200_finish_inner: ;# check if at least two particles remain add dword ptr [rsp + nb200_innerk], 4 mov edx, [rsp + nb200_innerk] and edx, 2 jnz .nb200_dopair jmp .nb200_checksingle.nb200_dopair: ;# twice-unrolled innerloop here mov rdx, [rsp + nb200_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] mov ebx, [rdx + 4] add qword ptr [rsp + nb200_innerjjnr], 8 ;# advance pointer (unrolled 2) mov rsi, [rbp + nb200_charge] movss xmm0, [rsi + rax*4] movss xmm1, [rsi + rbx*4] unpcklps xmm0, xmm1 ;# jqa jqb - - mulps xmm0, [rsp + nb200_iq] ;#qq lea rax, [rax + rax*2] ;# replace jnr with j3 lea rbx, [rbx + rbx*2] ;# load coordinates mov rdi, [rbp + nb200_pos] movlps xmm4, [rdi + rax*4] ;# x1 y1 - - movlps xmm5, [rdi + rbx*4] ;# x2 y2 - - movss xmm6, [rdi + rax*4 + 8] ;# z1 - - - movss xmm7, [rdi + rbx*4 + 8] ;# z2 - - - unpcklps xmm4, xmm5 ;# x1 x2 y1 y2 movhlps xmm5, xmm4 ;# y1 y2 - - unpcklps xmm6, xmm7 ;# z1 z2 - - ;# calc dr subps xmm4, [rsp + nb200_ix] subps xmm5, [rsp + nb200_iy] subps xmm6, [rsp + nb200_iz] ;# store dr in xmm9-xmm11 movaps xmm9, xmm4 movaps xmm10, xmm5 movaps xmm11, xmm6 ;# square it mulps xmm4,xmm4 mulps xmm5,xmm5 mulps xmm6,xmm6 addps xmm4, xmm5 addps xmm4, xmm6 ;# rsq in xmm4 movaps xmm7, [rsp + nb200_krf] rsqrtps xmm5, xmm4 ;# lookup seed in xmm5 movaps xmm2, xmm5 mulps xmm5, xmm5 movaps xmm1, [rsp + nb200_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm3, [rsp + nb200_half] mulps xmm7, xmm4 ;# xmm7=krsq subps xmm1, xmm5 ;# 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm3, xmm1 ;# xmm3=rinv movaps xmm4, xmm3 mulps xmm4, xmm4 ;# xmm4=rinvsq movaps xmm6, xmm3 addps xmm6, xmm7 ;# xmm6=rinv+ krsq subps xmm6, [rsp + nb200_crf] ;# xmm6=rinv+ krsq-crf mulps xmm6, xmm0 ;# xmm6=vcoul=qq*(rinv+ krsq) addps xmm7, xmm7 subps xmm3, xmm7 mulps xmm0, xmm3 mulps xmm4, xmm0 ;# xmm4=total fscal xorps xmm5, xmm5 movlhps xmm6, xmm5 ;# add potential to vctot (sum in xmm12) addps xmm12, xmm6 ;# calculate scalar force by multiplying dx/dy/dz with fscal mulps xmm9, xmm4 mulps xmm10, xmm4 mulps xmm11, xmm4 movlhps xmm9, xmm5 movlhps xmm10, xmm5 movlhps xmm11, xmm5 ;# xmm0-xmm2 contains tx-tz (partial force) ;# accumulate i forces addps xmm13, xmm9 addps xmm14, xmm10 addps xmm15, xmm11 mov rsi, [rbp + nb200_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.nb200_checksingle: mov edx, [rsp + nb200_innerk] and edx, 1 jnz .nb200_dosingle jmp .nb200_updateouterdata.nb200_dosingle: mov rcx, [rsp + nb200_innerjjnr] mov eax, [rcx] mov rsi, [rbp + nb200_charge] movss xmm0, [rsi + rax*4] ;# jq mulss xmm0, [rsp + nb200_iq] ;# qq lea rax, [rax + rax*2] ;# replace jnr with j3 mov rdi, [rbp + nb200_pos] movss xmm4, [rdi + rax*4] ;# x1 - - - movss xmm5, [rdi + rax*4 + 4] ;# y2 - - - movss xmm6, [rdi + rax*4 + 8] ;# 13 - - - ;# calc dr subss xmm4, [rsp + nb200_ix] subss xmm5, [rsp + nb200_iy] subss xmm6, [rsp + nb200_iz] ;# store dr in xmm9-xmm11 movaps xmm9, xmm4 movaps xmm10, xmm5 movaps xmm11, xmm6 ;# square it mulss xmm4,xmm4 mulss xmm5,xmm5 mulss xmm6,xmm6 addss xmm4, xmm5 addss xmm4, xmm6 ;# rsq in xmm4 movaps xmm7, [rsp + nb200_krf] rsqrtss xmm5, xmm4 ;# lookup seed in xmm5 movaps xmm2, xmm5 mulss xmm5, xmm5 movaps xmm1, [rsp + nb200_three] mulss xmm5, xmm4 ;# rsq*lu*lu movaps xmm3, [rsp + nb200_half] mulss xmm7, xmm4 ;# xmm7=krsq subss xmm1, xmm5 ;# 30-rsq*lu*lu mulss xmm1, xmm2 mulss xmm3, xmm1 ;# xmm3=rinv movaps xmm4, xmm3 mulss xmm4, xmm4 ;# xmm4=rinvsq movaps xmm6, xmm3 addss xmm6, xmm7 ;# xmm6=rinv+ krsq subss xmm6, [rsp + nb200_crf] ;# xmm6=rinv+ krsq-crf mulss xmm6, xmm0 ;# xmm6=vcoul=qq*(rinv+krsq-crf) addss xmm7, xmm7 subss xmm3, xmm7 mulss xmm0, xmm3 mulss xmm4, xmm0 ;# xmm4=total fscal ;# add potential to vctot (sum in xmm12) addss xmm12, xmm6 ;# 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 + nb200_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 .nb200_updateouterdata: mov ecx, [rsp + nb200_ii3] mov rdi, [rbp + nb200_faction] mov rsi, [rbp + nb200_fshift] mov edx, [rsp + nb200_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 + nb200_n] ;# get group index for i particle mov rdx, [rbp + nb200_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 + nb200_Vc] addss xmm12, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm12 ;# finish if last mov ecx, [rsp + nb200_nn1] ;# esi already loaded with n inc esi sub ecx, esi jz .nb200_outerend ;# not last, iterate outer loop once more! mov [rsp + nb200_n], esi jmp .nb200_outer.nb200_outerend: ;# check if more outer neighborlists remain mov ecx, [rsp + nb200_nri] ;# esi already loaded with n above sub ecx, esi jz .nb200_end ;# non-zero, do one more workunit jmp .nb200_threadloop.nb200_end: mov eax, [rsp + nb200_nouter] mov ebx, [rsp + nb200_ninner] mov rcx, [rbp + nb200_outeriter] mov rdx, [rbp + nb200_inneriter] mov [rcx], eax mov [rdx], ebx add rsp, 360 emms pop r15 pop r14 pop r13 pop r12 pop rbx pop rbp ret.globl nb_kernel200nf_x86_64_sse.globl _nb_kernel200nf_x86_64_ssenb_kernel200nf_x86_64_sse: _nb_kernel200nf_x86_64_sse: ;# Room for return address and rbp (16 bytes).equiv nb200nf_fshift, 16.equiv nb200nf_gid, 24.equiv nb200nf_pos, 32.equiv nb200nf_faction, 40.equiv nb200nf_charge, 48.equiv nb200nf_p_facel, 56.equiv nb200nf_argkrf, 64.equiv nb200nf_argcrf, 72.equiv nb200nf_Vc, 80.equiv nb200nf_type, 88.equiv nb200nf_p_ntype, 96.equiv nb200nf_vdwparam, 104.equiv nb200nf_Vvdw, 112.equiv nb200nf_p_tabscale, 120.equiv nb200nf_VFtab, 128.equiv nb200nf_invsqrta, 136.equiv nb200nf_dvda, 144.equiv nb200nf_p_gbtabscale, 152.equiv nb200nf_GBtab, 160.equiv nb200nf_p_nthreads, 168.equiv nb200nf_count, 176.equiv nb200nf_mtx, 184.equiv nb200nf_outeriter, 192.equiv nb200nf_inneriter, 200.equiv nb208nf_work, 200 ;# stack offsets for local variables ;# bottom of stack is cache-aligned for sse use .equiv nb200nf_ix, 0.equiv nb200nf_iy, 16.equiv nb200nf_iz, 32.equiv nb200nf_iq, 48.equiv nb200nf_vctot, 64.equiv nb200nf_half, 80.equiv nb200nf_three, 96.equiv nb200nf_krf, 112.equiv nb200nf_crf, 128.equiv nb200nf_is3, 144.equiv nb200nf_ii3, 148.equiv nb200nf_innerjjnr, 152.equiv nb200nf_nri, 160.equiv nb200nf_iinr, 168.equiv nb200nf_jindex, 176.equiv nb200nf_jjnr, 184.equiv nb200nf_shift, 192.equiv nb200nf_shiftvec, 200.equiv nb200nf_facel, 208.equiv nb200nf_innerk, 216.equiv nb200nf_n, 220.equiv nb200nf_nn1, 224.equiv nb200nf_nouter, 228.equiv nb200nf_ninner, 232 push rbp mov rbp, rsp push rbx emms push r12 push r13 push r14 push r15 sub rsp, 248 ;# local variable stack space (n*16+8) ;# zero 32-bit iteration counters mov eax, 0 mov [rsp + nb200nf_nouter], eax mov [rsp + nb200nf_ninner], eax mov edi, [rdi] mov [rsp + nb200nf_nri], edi mov [rsp + nb200nf_iinr], rsi mov [rsp + nb200nf_jindex], rdx mov [rsp + nb200nf_jjnr], rcx mov [rsp + nb200nf_shift], r8 mov [rsp + nb200nf_shiftvec], r9 mov rsi, [rbp + nb200nf_p_facel] movss xmm0, [rsi] movss [rsp + nb200nf_facel], xmm0 mov rsi, [rbp + nb200nf_argkrf] mov rdi, [rbp + nb200nf_argcrf] movss xmm1, [rsi] movss xmm2, [rdi] shufps xmm1, xmm1, 0 shufps xmm2, xmm2, 0
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?