nb_kernel233_ppc_altivec.c

来自「最著名最快的分子模拟软件」· C语言 代码 · 共 1,005 行 · 第 1/3 页

C
1,005
字号
    nri      = *p_nri;    ntype    = *p_ntype;	nul=vec_zero();	tsc=load_float_and_splat(p_tabscale);	vfacel=load_float_and_splat(p_facel);	vkrf=load_float_and_splat(p_krf);	vcrf=load_float_and_splat(p_crf);	ii         = iinr[0];	iqH        = vec_madd(load_float_and_splat(charge+ii+1),vfacel,nul);	iqM        = vec_madd(load_float_and_splat(charge+ii+3),vfacel,nul);	ntiA       = 2*ntype*type[ii];  #ifdef GMX_THREADS    nthreads = *p_nthreads;	do {		gmx_thread_mutex_lock((gmx_thread_mutex_t *)mtx);		nn0              = *count;		nn1              = nn0+(nri-nn0)/(2*nthreads)+3;		*count           = nn1;		gmx_thread_mutex_unlock((gmx_thread_mutex_t *)mtx);		if(nn1>nri) nn1=nri;		for(n=nn0; (n<nn1); n++) {#if 0		} /* maintain correct indentation even with conditional left braces */#endif#else /* without gmx_threads */		for(n=0;n<nri;n++) {#endif  			is3        = 3*shift[n];			ii         = iinr[n];			ii3        = 3*ii;			load_1_4atoms_shift_and_splat(pos+ii3,shiftvec+is3,&iOx,&iOy,&iOz,										  &iH1x,&iH1y,&iH1z,										  &iH2x,&iH2y,&iH2z,&iMx,&iMy,&iMz);			vctot      = nul;			Vvdwtot     = nul;			nj0        = jindex[n];			nj1        = jindex[n+1];    			for(k=nj0; k<(nj1-3); k+=4) {				jnra            = jjnr[k];				jnrb            = jjnr[k+1];				jnrc            = jjnr[k+2];				jnrd            = jjnr[k+3];				j3a             = 3*jnra;				j3b             = 3*jnrb;				j3c             = 3*jnrc;				j3d             = 3*jnrd;				transpose_4_to_3(load_xyz(pos+j3a),								 load_xyz(pos+j3b),								 load_xyz(pos+j3c),								 load_xyz(pos+j3d),&dMx,&dMy,&dMz);				dOx             = vec_sub(iOx,dMx);				dOy             = vec_sub(iOy,dMy);				dOz             = vec_sub(iOz,dMz);				dH1x            = vec_sub(iH1x,dMx);				dH1y            = vec_sub(iH1y,dMy);				dH1z            = vec_sub(iH1z,dMz);				dH2x            = vec_sub(iH2x,dMx);				dH2y            = vec_sub(iH2y,dMy);				dH2z            = vec_sub(iH2z,dMz);				dMx             = vec_sub(iMx,dMx);				dMy             = vec_sub(iMy,dMy);				dMz             = vec_sub(iMz,dMz);      				rsqO            = vec_madd(dOx,dOx,nul);				rsqH1           = vec_madd(dH1x,dH1x,nul);				rsqH2           = vec_madd(dH2x,dH2x,nul);				rsqM            = vec_madd(dMx,dMx,nul);				rsqO            = vec_madd(dOy,dOy,rsqO);				rsqH1           = vec_madd(dH1y,dH1y,rsqH1);				rsqH2           = vec_madd(dH2y,dH2y,rsqH2);				rsqM            = vec_madd(dMy,dMy,rsqM);				rsqO            = vec_madd(dOz,dOz,rsqO);				rsqH1           = vec_madd(dH1z,dH1z,rsqH1);				rsqH2           = vec_madd(dH2z,dH2z,rsqH2);				rsqM            = vec_madd(dMz,dMz,rsqM);				rinvO           = do_invsqrt(rsqO);				do_3_invsqrt(rsqM,rsqH1,rsqH2,&rinvM,&rinvH1,&rinvH2);				r               = vec_madd(rinvO,rsqO,nul);				rinvsqM         = vec_madd(rinvM,rinvM,nul);				rinvsqH1        = vec_madd(rinvH1,rinvH1,nul);				rinvsqH2        = vec_madd(rinvH2,rinvH2,nul);				tja             = ntiA+2*type[jnra];				tjb             = ntiA+2*type[jnrb];				tjc             = ntiA+2*type[jnrc];				tjd             = ntiA+2*type[jnrd];				/* load 4 j charges and multiply by iq */				jq=load_4_float(charge+jnra,charge+jnrb,								charge+jnrc,charge+jnrd);				load_4_pair(vdwparam+tja,vdwparam+tjb,vdwparam+tjc,vdwparam+tjd,&c6,&c12);				do_vonly_4_ljtable_lj(VFtab,vec_madd(r,tsc,nul),&VVd,&VVr);				Vvdwtot         = vec_madd(c6,VVd,Vvdwtot);				Vvdwtot         = vec_madd(c12,VVr,Vvdwtot);				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);				vctot           = vec_madd(qqH,vcoulH1,vctot);				vctot           = vec_madd(qqH,vcoulH2,vctot);			} 			if(k<(nj1-2)) {				jnra            = jjnr[k];				jnrb            = jjnr[k+1];				jnrc            = jjnr[k+2];				j3a             = 3*jnra;				j3b             = 3*jnrb;				j3c             = 3*jnrc;				transpose_4_to_3(load_xyz(pos+j3a),								 load_xyz(pos+j3b),								 load_xyz(pos+j3c),								 nul,								 &dMx,&dMy,&dMz);				dOx             = vec_sub(iOx,dMx);				dOy             = vec_sub(iOy,dMy);				dOz             = vec_sub(iOz,dMz);				dH1x            = vec_sub(iH1x,dMx);				dH1y            = vec_sub(iH1y,dMy);				dH1z            = vec_sub(iH1z,dMz);				dH2x            = vec_sub(iH2x,dMx);				dH2y            = vec_sub(iH2y,dMy);				dH2z            = vec_sub(iH2z,dMz);				dMx             = vec_sub(iMx,dMx);				dMy             = vec_sub(iMy,dMy);				dMz             = vec_sub(iMz,dMz);      				rsqO            = vec_madd(dOx,dOx,nul);				rsqH1           = vec_madd(dH1x,dH1x,nul);				rsqH2           = vec_madd(dH2x,dH2x,nul);				rsqM            = vec_madd(dMx,dMx,nul);				rsqO            = vec_madd(dOy,dOy,rsqO);				rsqH1           = vec_madd(dH1y,dH1y,rsqH1);				rsqH2           = vec_madd(dH2y,dH2y,rsqH2);				rsqM            = vec_madd(dMy,dMy,rsqM);				rsqO            = vec_madd(dOz,dOz,rsqO);				rsqH1           = vec_madd(dH1z,dH1z,rsqH1);				rsqH2           = vec_madd(dH2z,dH2z,rsqH2);				rsqM            = vec_madd(dMz,dMz,rsqM);				rinvO           = do_invsqrt(rsqO);				do_3_invsqrt(rsqM,rsqH1,rsqH2,&rinvM,&rinvH1,&rinvH2);      				zero_highest_element_in_vector(&rsqO);				zero_highest_element_in_vector(&rinvO);				zero_highest_element_in_3_vectors(&rsqM,&rsqH1,&rsqH2);				zero_highest_element_in_3_vectors(&rinvM,&rinvH1,&rinvH2);				r               = vec_madd(rinvO,rsqO,nul);				rinvsqM         = vec_madd(rinvM,rinvM,nul); 				rinvsqH1        = vec_madd(rinvH1,rinvH1,nul);				rinvsqH2        = vec_madd(rinvH2,rinvH2,nul);				tja             = ntiA+2*type[jnra];				tjb             = ntiA+2*type[jnrb];				tjc             = ntiA+2*type[jnrc];				tjd             = ntiA+2*type[jnrd];				/* load 3 j charges and multiply by iq */				jq=load_3_float(charge+jnra,charge+jnrb,charge+jnrc);				load_3_pair(vdwparam+tja,vdwparam+tjb,vdwparam+tjc,&c6,&c12);				do_vonly_3_ljtable_lj(VFtab,vec_madd(r,tsc,nul),&VVd,&VVr);				Vvdwtot         = vec_madd(c6,VVd,Vvdwtot);				Vvdwtot         = vec_madd(c12,VVr,Vvdwtot);				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);				vctot           = vec_madd(qqH,vcoulH1,vctot);				vctot           = vec_madd(qqH,vcoulH2,vctot);			} 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),&dMx,&dMy,&dMz);				dOx             = vec_sub(iOx,dMx);				dOy             = vec_sub(iOy,dMy);				dOz             = vec_sub(iOz,dMz);				dH1x            = vec_sub(iH1x,dMx);				dH1y            = vec_sub(iH1y,dMy);				dH1z            = vec_sub(iH1z,dMz);				dH2x            = vec_sub(iH2x,dMx);				dH2y            = vec_sub(iH2y,dMy);				dH2z            = vec_sub(iH2z,dMz);				dMx             = vec_sub(iMx,dMx);				dMy             = vec_sub(iMy,dMy);				dMz             = vec_sub(iMz,dMz);      				rsqO            = vec_madd(dOx,dOx,nul);				rsqH1           = vec_madd(dH1x,dH1x,nul);				rsqH2           = vec_madd(dH2x,dH2x,nul);				rsqM            = vec_madd(dMx,dMx,nul);				rsqO            = vec_madd(dOy,dOy,rsqO);				rsqH1           = vec_madd(dH1y,dH1y,rsqH1);				rsqH2           = vec_madd(dH2y,dH2y,rsqH2);				rsqM            = vec_madd(dMy,dMy,rsqM);				rsqO            = vec_madd(dOz,dOz,rsqO);				rsqH1           = vec_madd(dH1z,dH1z,rsqH1);				rsqH2           = vec_madd(dH2z,dH2z,rsqH2);				rsqM            = vec_madd(dMz,dMz,rsqM);				rinvO           = do_invsqrt(rsqO);				do_3_invsqrt(rsqM,rsqH1,rsqH2,&rinvM,&rinvH1,&rinvH2);      				zero_highest_element_in_vector(&rsqO);				zero_highest_element_in_vector(&rinvO);				zero_highest_element_in_3_vectors(&rsqM,&rsqH1,&rsqH2);				zero_highest_element_in_3_vectors(&rinvM,&rinvH1,&rinvH2);				r               = vec_madd(rinvO,rsqO,nul);				rinvsqM         = vec_madd(rinvM,rinvM,nul);				rinvsqH1        = vec_madd(rinvH1,rinvH1,nul);				rinvsqH2        = vec_madd(rinvH2,rinvH2,nul);				tja             = ntiA+2*type[jnra];				tjb             = ntiA+2*type[jnrb];				tjc             = ntiA+2*type[jnrc];				tjd             = ntiA+2*type[jnrd];				/* load 2 j charges and multiply by iq */				jq=load_2_float(charge+jnra,charge+jnrb);				load_2_pair(vdwparam+tja,vdwparam+tjb,&c6,&c12);				do_vonly_2_ljtable_lj(VFtab,vec_madd(r,tsc,nul),&VVd,&VVr);				Vvdwtot         = vec_madd(c6,VVd,Vvdwtot);				Vvdwtot         = vec_madd(c12,VVr,Vvdwtot);				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);				vctot           = vec_madd(qqH,vcoulH1,vctot);				vctot           = vec_madd(qqH,vcoulH2,vctot);			} else if(k<nj1) {				jnra            = jjnr[k];				j3a             = 3*jnra;				transpose_1_to_3(load_xyz(pos+j3a),&dMx,&dMy,&dMz);				dOx             = vec_sub(iOx,dMx);				dOy             = vec_sub(iOy,dMy);				dOz             = vec_sub(iOz,dMz);				dH1x            = vec_sub(iH1x,dMx);				dH1y            = vec_sub(iH1y,dMy);				dH1z            = vec_sub(iH1z,dMz);				dH2x            = vec_sub(iH2x,dMx);				dH2y            = vec_sub(iH2y,dMy);				dH2z            = vec_sub(iH2z,dMz);				dMx             = vec_sub(iMx,dMx);				dMy             = vec_sub(iMy,dMy);				dMz             = vec_sub(iMz,dMz);      				rsqO            = vec_madd(dOx,dOx,nul);				rsqH1           = vec_madd(dH1x,dH1x,nul);				rsqH2           = vec_madd(dH2x,dH2x,nul);				rsqM            = vec_madd(dMx,dMx,nul);				rsqO            = vec_madd(dOy,dOy,rsqO);				rsqH1           = vec_madd(dH1y,dH1y,rsqH1);				rsqH2           = vec_madd(dH2y,dH2y,rsqH2);				rsqM            = vec_madd(dMy,dMy,rsqM);				rsqO            = vec_madd(dOz,dOz,rsqO);				rsqH1           = vec_madd(dH1z,dH1z,rsqH1);				rsqH2           = vec_madd(dH2z,dH2z,rsqH2);				rsqM            = vec_madd(dMz,dMz,rsqM);				rinvO           = do_invsqrt(rsqO);				do_3_invsqrt(rsqM,rsqH1,rsqH2,&rinvM,&rinvH1,&rinvH2);      				zero_highest_element_in_vector(&rsqO);				zero_highest_element_in_vector(&rinvO);				zero_highest_element_in_3_vectors(&rsqM,&rsqH1,&rsqH2);				zero_highest_element_in_3_vectors(&rinvM,&rinvH1,&rinvH2);				r               = vec_madd(rinvO,rsqO,nul);				rinvsqM         = vec_madd(rinvM,rinvM,nul);				rinvsqH1        = vec_madd(rinvH1,rinvH1,nul);				rinvsqH2        = vec_madd(rinvH2,rinvH2,nul);				tja             = ntiA+2*type[jnra];				tjb             = ntiA+2*type[jnrb];				tjc             = ntiA+2*type[jnrc];				tjd             = ntiA+2*type[jnrd];				/* load 1 j charge and multiply by iq */				jq=load_1_float(charge+jnra);				load_1_pair(vdwparam+tja,&c6,&c12);				do_vonly_1_ljtable_lj(VFtab,vec_madd(r,tsc,nul),&VVd,&VVr);				Vvdwtot         = vec_madd(c6,VVd,Vvdwtot);				Vvdwtot         = vec_madd(c12,VVr,Vvdwtot);				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);				vctot           = vec_madd(qqH,vcoulH1,vctot);				vctot           = vec_madd(qqH,vcoulH2,vctot);			}			/* update outer data */			add_vector_to_float(Vc+gid[n],vctot);			add_vector_to_float(Vvdw+gid[n],Vvdwtot);			ninner += nj1 - nj0;		}#ifdef GMX_THREADS		nouter += nn1 - nn0;	} while (nn1<nri);#else	nouter = nri;#endif	*outeriter = nouter;	*inneriter = ninner;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?