nb_kernel203_ppc_altivec.c
来自「最著名最快的分子模拟软件」· C语言 代码 · 共 774 行 · 第 1/3 页
C
774 行
krsqH1 = vec_madd(vkrf,rsqH1,nul); krsqH2 = vec_madd(vkrf,rsqH2,nul); vcoulM = vec_add(rinvM,krsqM); vcoulH1 = vec_add(rinvH1,krsqH1); vcoulH2 = vec_add(rinvH2,krsqH2); vcoulM = vec_sub(vcoulM,vcrf); vcoulH1 = vec_sub(vcoulH1,vcrf); vcoulH2 = vec_sub(vcoulH2,vcrf); vctot = vec_madd(qqM,vcoulM,vctot); fsM = vec_nmsub(vec_two(),krsqM,rinvM); fsH1 = vec_nmsub(vec_two(),krsqH1,rinvH1); fsH2 = vec_nmsub(vec_two(),krsqH2,rinvH2); vctot = vec_madd(qqH,vcoulH1,vctot); fsM = vec_madd(fsM,qqM,nul); fsH1 = vec_madd(fsH1,qqH,nul); fsH2 = vec_madd(fsH2,qqH,nul); vctot = vec_madd(qqH,vcoulH2,vctot); fsM = vec_madd(fsM,rinvsqM,nul); fsH1 = vec_madd(fsH1,rinvsqH1,nul); fsH2 = vec_madd(fsH2,rinvsqH2,nul); fiMx = vec_madd(fsM,dMx,fiMx); /* +=fx */ dMx = vec_nmsub(fsM,dMx,nul); /* -fx */ fiMy = vec_madd(fsM,dMy,fiMy); /* +=fy */ dMy = vec_nmsub(fsM,dMy,nul); /* -fy */ fiMz = vec_madd(fsM,dMz,fiMz); /* +=fz */ dMz = vec_nmsub(fsM,dMz,nul); /* -fz */ fiH1x = vec_madd(fsH1,dH1x,fiH1x); /* +=fx */ dMx = vec_nmsub(fsH1,dH1x,dMx); /* -fx */ fiH1y = vec_madd(fsH1,dH1y,fiH1y); /* +=fy */ dMy = vec_nmsub(fsH1,dH1y,dMy); /* -fy */ fiH1z = vec_madd(fsH1,dH1z,fiH1z); /* +=fz */ dMz = vec_nmsub(fsH1,dH1z,dMz); /* -fz */ fiH2x = vec_madd(fsH2,dH2x,fiH2x); /* +=fx */ dMx = vec_nmsub(fsH2,dH2x,dMx); /* -fx */ fiH2y = vec_madd(fsH2,dH2y,fiH2y); /* +=fy */ dMy = vec_nmsub(fsH2,dH2y,dMy); /* -fy */ fiH2z = vec_madd(fsH2,dH2z,fiH2z); /* +=fz */ dMz = vec_nmsub(fsH2,dH2z,dMz); /* -fz */ transpose_4_to_3(dMx,dMy,dMz,nul,&tmp1,&tmp2,&tmp3); add_xyz_to_mem(faction+j3a,tmp1); add_xyz_to_mem(faction+j3b,tmp2); add_xyz_to_mem(faction+j3c,tmp3); } else if(k<(nj1-1)) { jnra = jjnr[k]; jnrb = jjnr[k+1]; j3a = 3*jnra; j3b = 3*jnrb; transpose_2_to_3(load_xyz(pos+j3a), load_xyz(pos+j3b),&dH2x,&dH2y,&dH2z); dMx = vec_sub(iMx,dH2x); dMy = vec_sub(iMy,dH2y); dMz = vec_sub(iMz,dH2z); dH1x = vec_sub(iH1x,dH2x); dH1y = vec_sub(iH1y,dH2y); dH1z = vec_sub(iH1z,dH2z); dH2x = vec_sub(iH2x,dH2x); dH2y = vec_sub(iH2y,dH2y); dH2z = vec_sub(iH2z,dH2z); rsqM = vec_madd(dMx,dMx,nul); rsqH1 = vec_madd(dH1x,dH1x,nul); rsqH2 = vec_madd(dH2x,dH2x,nul); rsqM = vec_madd(dMy,dMy,rsqM); rsqH1 = vec_madd(dH1y,dH1y,rsqH1); rsqH2 = vec_madd(dH2y,dH2y,rsqH2); rsqM = vec_madd(dMz,dMz,rsqM); rsqH1 = vec_madd(dH1z,dH1z,rsqH1); rsqH2 = vec_madd(dH2z,dH2z,rsqH2); zero_highest_2_elements_in_3_vectors(&rsqM,&rsqH1,&rsqH2); do_3_invsqrt(rsqM,rsqH1,rsqH2,&rinvM,&rinvH1,&rinvH2); zero_highest_2_elements_in_3_vectors(&rinvM,&rinvH1,&rinvH2); rinvsqM = vec_madd(rinvM,rinvM,nul); rinvsqH1 = vec_madd(rinvH1,rinvH1,nul); rinvsqH2 = vec_madd(rinvH2,rinvH2,nul); /* load 2 j charges and multiply by iq */ jq=load_2_float(charge+jnra,charge+jnrb); qqM = vec_madd(iqM,jq,nul); qqH = vec_madd(iqH,jq,nul); krsqM = vec_madd(vkrf,rsqM,nul); krsqH1 = vec_madd(vkrf,rsqH1,nul); krsqH2 = vec_madd(vkrf,rsqH2,nul); vcoulM = vec_add(rinvM,krsqM); vcoulH1 = vec_add(rinvH1,krsqH1); vcoulH2 = vec_add(rinvH2,krsqH2); vcoulM = vec_sub(vcoulM,vcrf); vcoulH1 = vec_sub(vcoulH1,vcrf); vcoulH2 = vec_sub(vcoulH2,vcrf); vctot = vec_madd(qqM,vcoulM,vctot); fsM = vec_nmsub(vec_two(),krsqM,rinvM); fsH1 = vec_nmsub(vec_two(),krsqH1,rinvH1); fsH2 = vec_nmsub(vec_two(),krsqH2,rinvH2); vctot = vec_madd(qqH,vcoulH1,vctot); fsM = vec_madd(fsM,qqM,nul); fsH1 = vec_madd(fsH1,qqH,nul); fsH2 = vec_madd(fsH2,qqH,nul); vctot = vec_madd(qqH,vcoulH2,vctot); fsM = vec_madd(fsM,rinvsqM,nul); fsH1 = vec_madd(fsH1,rinvsqH1,nul); fsH2 = vec_madd(fsH2,rinvsqH2,nul); fiMx = vec_madd(fsM,dMx,fiMx); /* +=fx */ dMx = vec_nmsub(fsM,dMx,nul); /* -fx */ fiMy = vec_madd(fsM,dMy,fiMy); /* +=fy */ dMy = vec_nmsub(fsM,dMy,nul); /* -fy */ fiMz = vec_madd(fsM,dMz,fiMz); /* +=fz */ dMz = vec_nmsub(fsM,dMz,nul); /* -fz */ fiH1x = vec_madd(fsH1,dH1x,fiH1x); /* +=fx */ dMx = vec_nmsub(fsH1,dH1x,dMx); /* -fx */ fiH1y = vec_madd(fsH1,dH1y,fiH1y); /* +=fy */ dMy = vec_nmsub(fsH1,dH1y,dMy); /* -fy */ fiH1z = vec_madd(fsH1,dH1z,fiH1z); /* +=fz */ dMz = vec_nmsub(fsH1,dH1z,dMz); /* -fz */ fiH2x = vec_madd(fsH2,dH2x,fiH2x); /* +=fx */ dMx = vec_nmsub(fsH2,dH2x,dMx); /* -fx */ fiH2y = vec_madd(fsH2,dH2y,fiH2y); /* +=fy */ dMy = vec_nmsub(fsH2,dH2y,dMy); /* -fy */ fiH2z = vec_madd(fsH2,dH2z,fiH2z); /* +=fz */ dMz = vec_nmsub(fsH2,dH2z,dMz); /* -fz */ transpose_3_to_2(dMx,dMy,dMz,&tmp1,&tmp2); add_xyz_to_mem(faction+j3a,tmp1); add_xyz_to_mem(faction+j3b,tmp2); } else if(k<nj1) { jnra = jjnr[k]; j3a = 3*jnra; transpose_1_to_3(load_xyz(pos+j3a),&dH2x,&dH2y,&dH2z); dMx = vec_sub(iMx,dH2x); dMy = vec_sub(iMy,dH2y); dMz = vec_sub(iMz,dH2z); dH1x = vec_sub(iH1x,dH2x); dH1y = vec_sub(iH1y,dH2y); dH1z = vec_sub(iH1z,dH2z); dH2x = vec_sub(iH2x,dH2x); dH2y = vec_sub(iH2y,dH2y); dH2z = vec_sub(iH2z,dH2z); rsqM = vec_madd(dMx,dMx,nul); rsqH1 = vec_madd(dH1x,dH1x,nul); rsqH2 = vec_madd(dH2x,dH2x,nul); rsqM = vec_madd(dMy,dMy,rsqM); rsqH1 = vec_madd(dH1y,dH1y,rsqH1); rsqH2 = vec_madd(dH2y,dH2y,rsqH2); rsqM = vec_madd(dMz,dMz,rsqM); rsqH1 = vec_madd(dH1z,dH1z,rsqH1); rsqH2 = vec_madd(dH2z,dH2z,rsqH2); zero_highest_3_elements_in_3_vectors(&rsqM,&rsqH1,&rsqH2); do_3_invsqrt(rsqM,rsqH1,rsqH2,&rinvM,&rinvH1,&rinvH2); zero_highest_3_elements_in_3_vectors(&rinvM,&rinvH1,&rinvH2); rinvsqM = vec_madd(rinvM,rinvM,nul); rinvsqH1 = vec_madd(rinvH1,rinvH1,nul); rinvsqH2 = vec_madd(rinvH2,rinvH2,nul); /* load 1 j charges and multiply by iq */ jq=load_1_float(charge+jnra); qqM = vec_madd(iqM,jq,nul); qqH = vec_madd(iqH,jq,nul); krsqM = vec_madd(vkrf,rsqM,nul); krsqH1 = vec_madd(vkrf,rsqH1,nul); krsqH2 = vec_madd(vkrf,rsqH2,nul); vcoulM = vec_add(rinvM,krsqM); vcoulH1 = vec_add(rinvH1,krsqH1); vcoulH2 = vec_add(rinvH2,krsqH2); vcoulM = vec_sub(vcoulM,vcrf); vcoulH1 = vec_sub(vcoulH1,vcrf); vcoulH2 = vec_sub(vcoulH2,vcrf); vctot = vec_madd(qqM,vcoulM,vctot); fsM = vec_nmsub(vec_two(),krsqM,rinvM); fsH1 = vec_nmsub(vec_two(),krsqH1,rinvH1); fsH2 = vec_nmsub(vec_two(),krsqH2,rinvH2); vctot = vec_madd(qqH,vcoulH1,vctot); fsM = vec_madd(fsM,qqM,nul); fsH1 = vec_madd(fsH1,qqH,nul); fsH2 = vec_madd(fsH2,qqH,nul); vctot = vec_madd(qqH,vcoulH2,vctot); fsM = vec_madd(fsM,rinvsqM,nul); fsH1 = vec_madd(fsH1,rinvsqH1,nul); fsH2 = vec_madd(fsH2,rinvsqH2,nul); fiMx = vec_madd(fsM,dMx,fiMx); /* +=fx */ dMx = vec_nmsub(fsM,dMx,nul); /* -fx */ fiMy = vec_madd(fsM,dMy,fiMy); /* +=fy */ dMy = vec_nmsub(fsM,dMy,nul); /* -fy */ fiMz = vec_madd(fsM,dMz,fiMz); /* +=fz */ dMz = vec_nmsub(fsM,dMz,nul); /* -fz */ fiH1x = vec_madd(fsH1,dH1x,fiH1x); /* +=fx */ dMx = vec_nmsub(fsH1,dH1x,dMx); /* -fx */ fiH1y = vec_madd(fsH1,dH1y,fiH1y); /* +=fy */ dMy = vec_nmsub(fsH1,dH1y,dMy); /* -fy */ fiH1z = vec_madd(fsH1,dH1z,fiH1z); /* +=fz */ dMz = vec_nmsub(fsH1,dH1z,dMz); /* -fz */ fiH2x = vec_madd(fsH2,dH2x,fiH2x); /* +=fx */ dMx = vec_nmsub(fsH2,dH2x,dMx); /* -fx */ fiH2y = vec_madd(fsH2,dH2y,fiH2y); /* +=fy */ dMy = vec_nmsub(fsH2,dH2y,dMy); /* -fy */ fiH2z = vec_madd(fsH2,dH2z,fiH2z); /* +=fz */ dMz = vec_nmsub(fsH2,dH2z,dMz); /* -fz */ transpose_3_to_1(dMx,dMy,dMz,&tmp1); add_xyz_to_mem(faction+j3a,tmp1); } /* update outer data */ update_i_3atoms_forces(faction+ii3+3,fshift+is3, fiH1x,fiH1y,fiH1z,fiH2x,fiH2y,fiH2z, fiMx,fiMy,fiMz); add_vector_to_float(Vc+gid[n],vctot); ninner += nj1 - nj0; }#ifdef GMX_THREADS nouter += nn1 - nn0; } while (nn1<nri);#else nouter = nri;#endif *outeriter = nouter; *inneriter = ninner;}void nb_kernel203nf_ppc_altivec(int * p_nri, int iinr[], int jindex[], int jjnr[], int shift[], float shiftvec[], float fshift[], int gid[], float pos[], float faction[], float charge[], float * p_facel, float * p_krf, float * p_crf, float Vc[], int type[], int * p_ntype, float vdwparam[], float Vvdw[], float * p_tabscale, float VFtab[], float invsqrta[], float dvda[], float * p_gbtabscale, float GBtab[], int * p_nthreads, int * count, void * mtx, int * outeriter, int * inneriter,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?