diff options
| author | Tor Aamodt <[email protected]> | 2010-10-01 08:55:28 -0800 |
|---|---|---|
| committer | Tor Aamodt <[email protected]> | 2010-10-01 08:55:28 -0800 |
| commit | 11b308e7363e937966b035b4891db32b4eece3bf (patch) | |
| tree | 50ca4c9ad6f163ac4acb2bf505e64dfebed66947 /benchmarks/CUDA/DG/src/MaxwellsKernel3d.cu | |
| parent | bb820c116764d7a1b8e071137d32b74e7f34dd2f (diff) | |
integrating recent changes from fermi-test into fermi
(i'll use "fermi" for more disruptive changes to the pipeline model such
as updating the MSHRs and getting rid of the warp tracker, ripping out DWF, etc...)
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 7805]
Diffstat (limited to 'benchmarks/CUDA/DG/src/MaxwellsKernel3d.cu')
| -rw-r--r-- | benchmarks/CUDA/DG/src/MaxwellsKernel3d.cu | 551 |
1 files changed, 0 insertions, 551 deletions
diff --git a/benchmarks/CUDA/DG/src/MaxwellsKernel3d.cu b/benchmarks/CUDA/DG/src/MaxwellsKernel3d.cu deleted file mode 100644 index bfa4396..0000000 --- a/benchmarks/CUDA/DG/src/MaxwellsKernel3d.cu +++ /dev/null @@ -1,551 +0,0 @@ -/* -*- mode: C; c-basic-offset: 8; c-indent-level: 8; c-continued-statement-offset: 8; c-label-offset: -8; -*- */ - -#include <stdio.h> -#include <cuda.h> - -texture<float4, 1, cudaReadModeElementType> t_LIFT; -texture<float4, 1, cudaReadModeElementType> t_DrDsDt; -texture<float, 1, cudaReadModeElementType> t_Dr; -texture<float, 1, cudaReadModeElementType> t_Ds; -texture<float, 1, cudaReadModeElementType> t_Dt; -texture<float, 1, cudaReadModeElementType> t_vgeo; -texture<float4, 1, cudaReadModeElementType> t_vgeo4; -texture<float, 1, cudaReadModeElementType> t_Q; -texture<float, 1, cudaReadModeElementType> t_partQ; -texture<float, 1, cudaReadModeElementType> t_surfinfo; - -static float *c_LIFT; -static float *c_DrDsDt; -static float *c_surfinfo; -static float *c_vgeo; -static float *c_Q; -static float *c_partQ; -static float *c_rhsQ; -static float *c_resQ; -static float *c_tmp; - -extern "C" -{ - -#include "fem.h" - -double InitGPU3d(Mesh *mesh, int Nfields){ - - /* Q */ - int sz = mesh->K*(BSIZE)*p_Nfields*sizeof(float); - - float *f_Q = (float*) calloc(mesh->K*BSIZE*p_Nfields, sizeof(float)); - cudaMalloc ((void**) &c_Q, sz); - cudaMalloc ((void**) &c_rhsQ, sz); - cudaMalloc ((void**) &c_resQ, sz); - cudaMalloc ((void**) &c_tmp, sz); - cudaMemcpy( c_Q, f_Q, sz, cudaMemcpyHostToDevice); - cudaMemcpy( c_rhsQ, f_Q, sz, cudaMemcpyHostToDevice); - cudaMemcpy( c_resQ, f_Q, sz, cudaMemcpyHostToDevice); - cudaMemcpy( c_tmp, f_Q, sz, cudaMemcpyHostToDevice); - - cudaBindTexture(0, t_Q, c_Q, sz); - - sz = mesh->parNtotalout*sizeof(float); - cudaMalloc((void**) &c_partQ, sz); - cudaBindTexture(0, t_partQ, c_partQ, sz); - - /* LIFT */ - sz = p_Np*(p_Nfp)*p_Nfaces*sizeof(float); -#if 0 - float *f_LIFT = (float*) malloc(sz); - int skL = 0; - for(int m=0;m<p_Nfp*p_Nfaces;++m){ - for(int n=0;n<p_Np;++n){ - f_LIFT[skL++] = d_LIFT[n+p_Np*m]; - } - } -#else - float *f_LIFT = (float*) malloc(sz); - int skL = 0; - for(int m=0;m<p_Nfp;++m){ - for(int n=0;n<p_Np;++n){ - for(int f=0;f<p_Nfaces;++f){ - f_LIFT[skL++] = mesh->LIFT[0][p_Nfp*p_Nfaces*n+(f+p_Nfaces*m)]; - } - } - } -#endif - cudaMalloc ((void**) &c_LIFT, sz); - cudaMemcpy( c_LIFT, f_LIFT, sz, cudaMemcpyHostToDevice); - - /* Bind the array to the texture */ - cudaBindTexture(0, t_LIFT, c_LIFT, sz); - - /* DrDsDt */ - sz = BSIZE*BSIZE*4*sizeof(float); - - float* h_DrDsDt = (float*) calloc(BSIZE*BSIZE, sizeof(float4)); - int sk = 0; - /* note transposed arrays to avoid "bank conflicts" */ - for(int n=0;n<p_Np;++n){ - for(int m=0;m<p_Np;++m){ - h_DrDsDt[4*(m+n*BSIZE)+0] = mesh->Dr[0][n+m*p_Np]; - h_DrDsDt[4*(m+n*BSIZE)+1] = mesh->Ds[0][n+m*p_Np]; - h_DrDsDt[4*(m+n*BSIZE)+2] = mesh->Dt[0][n+m*p_Np]; - } - } - - cudaMalloc ((void**) &c_DrDsDt, sz); - cudaMemcpy( c_DrDsDt, h_DrDsDt, sz, cudaMemcpyHostToDevice); - - /* Bind the array to the texture */ - cudaBindTexture(0, t_DrDsDt, c_DrDsDt, sz); - - free(h_DrDsDt); - - /* vgeo */ - double drdx, dsdx, dtdx; - double drdy, dsdy, dtdy; - double drdz, dsdz, dtdz, J; - float *vgeo = (float*) calloc(12*mesh->K, sizeof(float)); - - for(int k=0;k<mesh->K;++k){ - GeometricFactors3d(mesh, k, - &drdx, &dsdx, &dtdx, - &drdy, &dsdy, &dtdy, - &drdz, &dsdz, &dtdz, &J); - - vgeo[k*12+0] = drdx; vgeo[k*12+1] = drdy; vgeo[k*12+2] = drdz; - vgeo[k*12+4] = dsdx; vgeo[k*12+5] = dsdy; vgeo[k*12+6] = dsdz; - vgeo[k*12+8] = dtdx; vgeo[k*12+9] = dtdy; vgeo[k*12+10] = dtdz; - - } - - sz = mesh->K*12*sizeof(float); - cudaMalloc ((void**) &c_vgeo, sz); - cudaMemcpy( c_vgeo, vgeo, sz, cudaMemcpyHostToDevice); - cudaBindTexture(0, t_vgeo, c_vgeo, sz); - - /* surfinfo (vmapM, vmapP, Fscale, Bscale, nx, ny, nz, 0) */ - sz = mesh->K*p_Nfp*p_Nfaces*7*sizeof(float); - float* h_surfinfo = (float*) malloc(sz); - - /* local-local info */ - sk = 0; - int skP = -1; - double *nxk = BuildVector(mesh->Nfaces); - double *nyk = BuildVector(mesh->Nfaces); - double *nzk = BuildVector(mesh->Nfaces); - double *sJk = BuildVector(mesh->Nfaces); - - double dt = 1e6; - - for(int k=0;k<mesh->K;++k){ - - GeometricFactors3d(mesh, k, - &drdx, &dsdx, &dtdx, - &drdy, &dsdy, &dtdy, - &drdz, &dsdz, &dtdz, &J); - - Normals3d(mesh, k, nxk, nyk, nzk, sJk); - - for(int f=0;f<mesh->Nfaces;++f){ - - dt = min(dt, J/sJk[f]); - - for(int m=0;m<p_Nfp;++m){ - int n = m + f*p_Nfp + p_Nfp*p_Nfaces*k; - int idM = mesh->vmapM[n]; - int idP = mesh->vmapP[n]; - int nM = idM%p_Np; - int nP = idP%p_Np; - int kM = (idM-nM)/p_Np; - int kP = (idP-nP)/p_Np; - idM = nM + Nfields*BSIZE*kM; - idP = nP + Nfields*BSIZE*kP; - - /* stub resolve some other way */ - if(mesh->vmapP[n]<0){ - idP = mesh->vmapP[n]; /* -ve numbers */ - } - - sk = 7*p_Nfp*p_Nfaces*k+m+f*p_Nfp; - h_surfinfo[sk + 0*p_Nfp*p_Nfaces] = idM; - h_surfinfo[sk + 1*p_Nfp*p_Nfaces] = idP; - h_surfinfo[sk + 2*p_Nfp*p_Nfaces] = sJk[f]/(2.*J); - h_surfinfo[sk + 3*p_Nfp*p_Nfaces] = (idM==idP)?-1.:1.; - h_surfinfo[sk + 4*p_Nfp*p_Nfaces] = nxk[f]; - h_surfinfo[sk + 5*p_Nfp*p_Nfaces] = nyk[f]; - h_surfinfo[sk + 6*p_Nfp*p_Nfaces] = nzk[f]; - } - } - } - - cudaMalloc ((void**) &c_surfinfo, sz); - cudaMemcpy( c_surfinfo, h_surfinfo, sz, cudaMemcpyHostToDevice); - - cudaBindTexture(0, t_surfinfo, c_surfinfo, sz); - - free(h_surfinfo); - - sz = mesh->parNtotalout*sizeof(int); - cudaMalloc((void**) &(mesh->c_parmapOUT), sz); - cudaMemcpy(mesh->c_parmapOUT, mesh->parmapOUT, sz, cudaMemcpyHostToDevice); - - return dt; -} - - - -__global__ void MaxwellsGPU_VOL_Kernel3D(float *g_rhsQ){ - - /* fastest */ - __device__ __shared__ float s_Q[p_Nfields*BSIZE]; - __device__ __shared__ float s_facs[12]; - - const int n = threadIdx.x; - const int k = blockIdx.x; - - /* "coalesced" */ - int m = n+k*p_Nfields*BSIZE; - int id = n; - s_Q[id] = tex1Dfetch(t_Q, m); m+=BSIZE; id+=BSIZE; - s_Q[id] = tex1Dfetch(t_Q, m); m+=BSIZE; id+=BSIZE; - s_Q[id] = tex1Dfetch(t_Q, m); m+=BSIZE; id+=BSIZE; - s_Q[id] = tex1Dfetch(t_Q, m); m+=BSIZE; id+=BSIZE; - s_Q[id] = tex1Dfetch(t_Q, m); m+=BSIZE; id+=BSIZE; - s_Q[id] = tex1Dfetch(t_Q, m); - - if(p_Np<12 && n==0) - for(m=0;m<12;++m) - s_facs[m] = tex1Dfetch(t_vgeo, 12*k+m); - else if(n<12 && p_Np>=12) - s_facs[n] = tex1Dfetch(t_vgeo, 12*k+n); - - __syncthreads(); - - float dHxdr=0,dHxds=0,dHxdt=0; - float dHydr=0,dHyds=0,dHydt=0; - float dHzdr=0,dHzds=0,dHzdt=0; - float dExdr=0,dExds=0,dExdt=0; - float dEydr=0,dEyds=0,dEydt=0; - float dEzdr=0,dEzds=0,dEzdt=0; - float Q; - - for(m=0;p_Np-m;){ - float4 D = tex1Dfetch(t_DrDsDt, n+m*BSIZE); - - id = m; - Q = s_Q[id]; dHxdr += D.x*Q; dHxds += D.y*Q; dHxdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dHydr += D.x*Q; dHyds += D.y*Q; dHydt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dHzdr += D.x*Q; dHzds += D.y*Q; dHzdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dExdr += D.x*Q; dExds += D.y*Q; dExdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dEydr += D.x*Q; dEyds += D.y*Q; dEydt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dEzdr += D.x*Q; dEzds += D.y*Q; dEzdt += D.z*Q; - - ++m; -#if ( (p_Np) % 2 )==0 - D = tex1Dfetch(t_DrDsDt, n+m*BSIZE); - - id = m; - Q = s_Q[id]; dHxdr += D.x*Q; dHxds += D.y*Q; dHxdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dHydr += D.x*Q; dHyds += D.y*Q; dHydt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dHzdr += D.x*Q; dHzds += D.y*Q; dHzdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dExdr += D.x*Q; dExds += D.y*Q; dExdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dEydr += D.x*Q; dEyds += D.y*Q; dEydt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dEzdr += D.x*Q; dEzds += D.y*Q; dEzdt += D.z*Q; - - ++m; - -#if ( (p_Np)%3 )==0 - D = tex1Dfetch(t_DrDsDt, n+m*BSIZE); - - id = m; - Q = s_Q[id]; dHxdr += D.x*Q; dHxds += D.y*Q; dHxdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dHydr += D.x*Q; dHyds += D.y*Q; dHydt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dHzdr += D.x*Q; dHzds += D.y*Q; dHzdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dExdr += D.x*Q; dExds += D.y*Q; dExdt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dEydr += D.x*Q; dEyds += D.y*Q; dEydt += D.z*Q; id += BSIZE; - Q = s_Q[id]; dEzdr += D.x*Q; dEzds += D.y*Q; dEzdt += D.z*Q; - - ++m; -#endif -#endif - } - - const float drdx= s_facs[0]; - const float drdy= s_facs[1]; - const float drdz= s_facs[2]; - const float dsdx= s_facs[4]; - const float dsdy= s_facs[5]; - const float dsdz= s_facs[6]; - const float dtdx= s_facs[8]; - const float dtdy= s_facs[9]; - const float dtdz= s_facs[10]; - - m = n+p_Nfields*BSIZE*k; - - g_rhsQ[m] = -(drdy*dEzdr+dsdy*dEzds+dtdy*dEzdt - drdz*dEydr-dsdz*dEyds-dtdz*dEydt); m += BSIZE; - g_rhsQ[m] = -(drdz*dExdr+dsdz*dExds+dtdz*dExdt - drdx*dEzdr-dsdx*dEzds-dtdx*dEzdt); m += BSIZE; - g_rhsQ[m] = -(drdx*dEydr+dsdx*dEyds+dtdx*dEydt - drdy*dExdr-dsdy*dExds-dtdy*dExdt); m += BSIZE; - g_rhsQ[m] = (drdy*dHzdr+dsdy*dHzds+dtdy*dHzdt - drdz*dHydr-dsdz*dHyds-dtdz*dHydt); m += BSIZE; - g_rhsQ[m] = (drdz*dHxdr+dsdz*dHxds+dtdz*dHxdt - drdx*dHzdr-dsdx*dHzds-dtdx*dHzdt); m += BSIZE; - g_rhsQ[m] = (drdx*dHydr+dsdx*dHyds+dtdx*dHydt - drdy*dHxdr-dsdy*dHxds-dtdy*dHxdt); -} - -__global__ void MaxwellsGPU_SURF_Kernel3D(float *g_Q, float *g_rhsQ){ - - __device__ __shared__ float s_fluxQ[p_Nfields*p_Nfp*p_Nfaces]; - - const int n = threadIdx.x; - const int k = blockIdx.x; - int m; - - /* grab surface nodes and store flux in shared memory */ - if(n< (p_Nfp*p_Nfaces) ){ - /* coalesced reads (maybe) */ - m = 7*(k*p_Nfp*p_Nfaces)+n; - const int idM = tex1Dfetch(t_surfinfo, m); m += p_Nfp*p_Nfaces; - int idP = tex1Dfetch(t_surfinfo, m); m += p_Nfp*p_Nfaces; - const float Fsc = tex1Dfetch(t_surfinfo, m); m += p_Nfp*p_Nfaces; - const float Bsc = tex1Dfetch(t_surfinfo, m); m += p_Nfp*p_Nfaces; - const float nx = tex1Dfetch(t_surfinfo, m); m += p_Nfp*p_Nfaces; - const float ny = tex1Dfetch(t_surfinfo, m); m += p_Nfp*p_Nfaces; - const float nz = tex1Dfetch(t_surfinfo, m); - - /* check if idP<0 */ - double dHx, dHy, dHz, dEx, dEy, dEz; - if(idP<0){ - idP = p_Nfields*(-1-idP); - - dHx = Fsc*(tex1Dfetch(t_partQ, idP+0) - tex1Dfetch(t_Q, idM+0*BSIZE)); - dHy = Fsc*(tex1Dfetch(t_partQ, idP+1) - tex1Dfetch(t_Q, idM+1*BSIZE)); - dHz = Fsc*(tex1Dfetch(t_partQ, idP+2) - tex1Dfetch(t_Q, idM+2*BSIZE)); - - dEx = Fsc*(tex1Dfetch(t_partQ, idP+3) - tex1Dfetch(t_Q, idM+3*BSIZE)); - dEy = Fsc*(tex1Dfetch(t_partQ, idP+4) - tex1Dfetch(t_Q, idM+4*BSIZE)); - dEz = Fsc*(tex1Dfetch(t_partQ, idP+5) - tex1Dfetch(t_Q, idM+5*BSIZE)); - } - else{ - dHx = Fsc*(tex1Dfetch(t_Q, idP+0*BSIZE) - tex1Dfetch(t_Q, idM+0*BSIZE)); - dHy = Fsc*(tex1Dfetch(t_Q, idP+1*BSIZE) - tex1Dfetch(t_Q, idM+1*BSIZE)); - dHz = Fsc*(tex1Dfetch(t_Q, idP+2*BSIZE) - tex1Dfetch(t_Q, idM+2*BSIZE)); - - dEx = Fsc*(Bsc*tex1Dfetch(t_Q, idP+3*BSIZE) - tex1Dfetch(t_Q, idM+3*BSIZE)); - dEy = Fsc*(Bsc*tex1Dfetch(t_Q, idP+4*BSIZE) - tex1Dfetch(t_Q, idM+4*BSIZE)); - dEz = Fsc*(Bsc*tex1Dfetch(t_Q, idP+5*BSIZE) - tex1Dfetch(t_Q, idM+5*BSIZE)); - } - - const double ndotdH = nx*dHx + ny*dHy + nz*dHz; - const double ndotdE = nx*dEx + ny*dEy + nz*dEz; - - m = n; - s_fluxQ[m] = -ny*dEz + nz*dEy + dHx - ndotdH*nx; m += p_Nfp*p_Nfaces; - s_fluxQ[m] = -nz*dEx + nx*dEz + dHy - ndotdH*ny; m += p_Nfp*p_Nfaces; - s_fluxQ[m] = -nx*dEy + ny*dEx + dHz - ndotdH*nz; m += p_Nfp*p_Nfaces; - - s_fluxQ[m] = ny*dHz - nz*dHy + dEx - ndotdE*nx; m += p_Nfp*p_Nfaces; - s_fluxQ[m] = nz*dHx - nx*dHz + dEy - ndotdE*ny; m += p_Nfp*p_Nfaces; - s_fluxQ[m] = nx*dHy - ny*dHx + dEz - ndotdE*nz; - } - - /* make sure all element data points are cached */ - __syncthreads(); - - if(n< (p_Np)) - { - float rhsHx = 0, rhsHy = 0, rhsHz = 0; - float rhsEx = 0, rhsEy = 0, rhsEz = 0; - - int sk = n; - /* can manually unroll to 4 because there are 4 faces */ - for(m=0;p_Nfaces*p_Nfp-m;){ - const float4 L = tex1Dfetch(t_LIFT, sk); sk+=p_Np; - - /* broadcast */ - int sk1 = m; - rhsHx += L.x*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHy += L.x*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHz += L.x*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEx += L.x*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEy += L.x*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEz += L.x*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - ++m; - - /* broadcast */ - sk1 = m; - rhsHx += L.y*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHy += L.y*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHz += L.y*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEx += L.y*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEy += L.y*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEz += L.y*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - ++m; - - /* broadcast */ - sk1 = m; - rhsHx += L.z*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHy += L.z*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHz += L.z*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEx += L.z*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEy += L.z*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEz += L.z*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - ++m; - - /* broadcast */ - sk1 = m; - rhsHx += L.w*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHy += L.w*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsHz += L.w*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEx += L.w*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEy += L.w*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - rhsEz += L.w*s_fluxQ[sk1]; sk1 += p_Nfp*p_Nfaces; - ++m; - - } - - m = n+p_Nfields*k*BSIZE; - g_rhsQ[m] += rhsHx; m += BSIZE; - g_rhsQ[m] += rhsHy; m += BSIZE; - g_rhsQ[m] += rhsHz; m += BSIZE; - g_rhsQ[m] += rhsEx; m += BSIZE; - g_rhsQ[m] += rhsEy; m += BSIZE; - g_rhsQ[m] += rhsEz; m += BSIZE; - - } -} - - -__global__ void MaxwellsGPU_RK_Kernel3D(int Ntotal, float *g_resQ, float *g_rhsQ, float *g_Q, float fa, float fb, float fdt){ - - int n = blockIdx.x * blockDim.x + threadIdx.x; - - if(n<Ntotal){ - float rhs = g_rhsQ[n]; - float res = g_resQ[n]; - res = fa*res + fdt*rhs; - - g_resQ[n] = res; - g_Q[n] += fb*res; - } - -} - - -/* assumes data resides on device */ -void MaxwellsKernel3d(Mesh *mesh, float frka, float frkb, float fdt){ - - /* grab data from device and initiate sends */ - MaxwellsMPISend3d(mesh); - - int ThreadsPerBlock, BlocksPerGrid; - - BlocksPerGrid = mesh->K; - ThreadsPerBlock = p_Np; - - /* evaluate volume derivatives */ - MaxwellsGPU_VOL_Kernel3D <<< BlocksPerGrid, ThreadsPerBlock >>> (c_rhsQ); - - /* finalize sends and recvs, and transfer to device */ - MaxwellsMPIRecv3d(mesh, c_partQ); - - BlocksPerGrid = mesh->K; - - if( ( p_Nfp*p_Nfaces ) > (p_Np) ) - ThreadsPerBlock = p_Nfp*p_Nfaces; - else - ThreadsPerBlock = p_Np; - - /* evaluate surface contributions */ - MaxwellsGPU_SURF_Kernel3D <<< BlocksPerGrid, ThreadsPerBlock >>> (c_Q, c_rhsQ); - - int Ntotal = mesh->K*BSIZE*p_Nfields; - - ThreadsPerBlock = 256; - BlocksPerGrid = (Ntotal+ThreadsPerBlock-1)/ThreadsPerBlock; - - /* update RK Step */ - MaxwellsGPU_RK_Kernel3D<<< BlocksPerGrid, ThreadsPerBlock >>> - (Ntotal, c_resQ, c_rhsQ, c_Q, frka, frkb, fdt); - -} - - - - -void gpu_set_data3d(int K, - double *d_Hx, double *d_Hy, double *d_Hz, - double *d_Ex, double *d_Ey, double *d_Ez){ - - - float *f_Q = (float*) calloc(K*p_Nfields*BSIZE,sizeof(float)); - - /* also load into usual data matrices */ - - for(int k=0;k<K;++k){ - int gk = k; - for(int n=0;n<p_Np;++n) - f_Q[n +k*BSIZE*p_Nfields] = d_Hx[n+gk*p_Np]; - for(int n=0;n<p_Np;++n) - f_Q[n +BSIZE+k*BSIZE*p_Nfields] = d_Hy[n+gk*p_Np]; - for(int n=0;n<p_Np;++n) - f_Q[n+2*BSIZE+k*BSIZE*p_Nfields] = d_Hz[n+gk*p_Np]; - for(int n=0;n<p_Np;++n) - f_Q[n+3*BSIZE+k*BSIZE*p_Nfields] = d_Ex[n+gk*p_Np]; - for(int n=0;n<p_Np;++n) - f_Q[n+4*BSIZE+k*BSIZE*p_Nfields] = d_Ey[n+gk*p_Np]; - for(int n=0;n<p_Np;++n) - f_Q[n+5*BSIZE+k*BSIZE*p_Nfields] = d_Ez[n+gk*p_Np]; - } - - cudaMemcpy(c_Q, f_Q, BSIZE*K*p_Nfields*sizeof(float), cudaMemcpyHostToDevice); - - free(f_Q); -} - -void gpu_get_data3d(int K, - double *d_Hx, double *d_Hy, double *d_Hz, - double *d_Ex, double *d_Ey, double *d_Ez){ - - float *f_Q = (float*) calloc(K*p_Nfields*BSIZE,sizeof(float)); - - cudaMemcpy(f_Q, c_Q, K*BSIZE*p_Nfields*sizeof(float), cudaMemcpyDeviceToHost); - - /* also load into usual data matrices */ - - for(int k=0;k<K;++k){ - int gk = k; - for(int n=0;n<p_Np;++n) - d_Hx[n+gk*p_Np] = f_Q[n +k*BSIZE*p_Nfields]; - for(int n=0;n<p_Np;++n) - d_Hy[n+gk*p_Np] = f_Q[n +BSIZE+k*BSIZE*p_Nfields]; - for(int n=0;n<p_Np;++n) - d_Hz[n+gk*p_Np] = f_Q[n+2*BSIZE+k*BSIZE*p_Nfields]; - for(int n=0;n<p_Np;++n) - d_Ex[n+gk*p_Np] = f_Q[n+3*BSIZE+k*BSIZE*p_Nfields]; - for(int n=0;n<p_Np;++n) - d_Ey[n+gk*p_Np] = f_Q[n+4*BSIZE+k*BSIZE*p_Nfields]; - for(int n=0;n<p_Np;++n) - d_Ez[n+gk*p_Np] = f_Q[n+5*BSIZE+k*BSIZE*p_Nfields]; - - } - - free(f_Q); -} - -__global__ void partial_get_kernel3d(int Ntotal, int *g_index, float *g_partQ){ - - int n = blockIdx.x * blockDim.x + threadIdx.x; - - if(n<Ntotal) - g_partQ[n] = tex1Dfetch(t_Q, g_index[n]); - -} - -void get_partial_gpu_data3d(int Ntotal, int *g_index, float *h_partQ){ - - int ThreadsPerBlock = 256; - int BlocksPerGrid = (Ntotal+ThreadsPerBlock-1)/ThreadsPerBlock; - - partial_get_kernel3d <<< BlocksPerGrid, ThreadsPerBlock >>> (Ntotal, g_index, c_tmp); - - cudaMemcpy(h_partQ, c_tmp, Ntotal*sizeof(float), cudaMemcpyDeviceToHost); -} - -} |
