/******************************************************************** * sample.cu * This is a example of the CUDA program. *********************************************************************/ #include #include #include #include /************************************************************************/ /* Init CUDA */ /************************************************************************/ #if __DEVICE_EMULATION__ bool InitCUDA(void){return true;} #else bool InitCUDA(void) { int count = 0; int i = 0; cudaGetDeviceCount(&count); if(count == 0) { fprintf(stderr, "There is no device.\n"); return false; } for(i = 0; i < count; i++) { cudaDeviceProp prop; if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) { if(prop.major >= 1) { break; } } } if(i == count) { fprintf(stderr, "There is no device supporting CUDA.\n"); return false; } cudaSetDevice(i); printf("CUDA initialized.\n"); return true; } #endif /******************************************************************/ /* Denisity Gradient Function */ /************************************************************************/ __device__ float grad_N (int node, int coord, float x0, float y0, float z0, float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3) { switch (node) { case 0: switch (coord) { case 0: return (y1 * z2 - y1 * z3 - z1 * y2 + z1 * y3 + y2 * z3 - y3 * z2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 1: return -(x1 * z2 - x1 * z3 - z1 * x2 + z1 * x3 + x2 * z3 - x3 * z2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 2: return (x1 * y2 - x1 * y3 - y1 * x2 + y1 * x3 + x2 * y3 - x3 * y2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); } break; case 1: switch (coord) { case 0: return -(y0 * z2 - y0 * z3 - z0 * y2 + z0 * y3 + y2 * z3 - y3 * z2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 1: return (x0 * z2 - x0 * z3 - z0 * x2 + z0 * x3 + x2 * z3 - x3 * z2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 2: return -(x0 * y2 - x0 * y3 - y0 * x2 + y0 * x3 + x2 * y3 - x3 * y2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; } case 2: switch (coord) { case 0: return (y0 * z1 - y0 * z3 - z0 * y1 + z0 * y3 + y1 * z3 - z1 * y3) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 1: return -(x0 * z1 - x0 * z3 - z0 * x1 + z0 * x3 + x1 * z3 - z1 * x3) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 2: return (x0 * y1 - x0 * y3 - y0 * x1 + y0 * x3 + x1 * y3 - y1 * x3) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; } case 3: switch (coord) { case 0: return -(y0 * z1 - y0 * z2 - z0 * y1 + z0 * y2 + y1 * z2 - z1 * y2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 1: return (x0 * z1 - x0 * z2 - z0 * x1 + z0 * x2 + x1 * z2 - z1 * x2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; case 2: return -(x0 * y1 - x0 * y2 - y0 * x1 + y0 * x2 + x1 * y2 - y1 * x2) / (x0 * y1 * z2 - x0 * y1 * z3 - x0 * z1 * y2 + x0 * z1 * y3 + x0 * y2 * z3 - x0 * y3 * z2 - y0 * x1 * z2 + y0 * x1 * z3 + y0 * z1 * x2 - y0 * z1 * x3 - y0 * x2 * z3 + y0 * x3 * z2 + z0 * x1 * y2 - z0 * x1 * y3 - z0 * y1 * x2 + z0 * y1 * x3 + z0 * x2 * y3 - z0 * x3 * y2 - x1 * y2 * z3 + x1 * y3 * z2 + y1 * x2 * z3 - y1 * x3 * z2 - z1 * x2 * y3 + z1 * x3 * y2); break; } } return 0; } /******************************************************************/ /* Denisity Kernel Function */ /************************************************************************/ __global__ void calcDivergenceDensity(int * ids, int * unique_neighbours_array, int * unique_number_neighbours, int * unique_neighbours_index, int * neighbours_array, int * neighbours_array_ids, int * neighbours_array_index, int * number_neighbours, float * displacements, float * vertices, float * initialDensity, float * divigden, int as, int t) { int idx=blockIdx.x*blockDim.x+threadIdx.x; int idy=blockIdx.y*blockDim.y+threadIdx.y; int index = idy*as+idx; //int neighbours = unique_number_neighbours[index]; int j=0; int j_prime=0; int number_tetra; int k,m,l; int shape ,chunkoffset; float displ[3]; //int kId; float divig=0; float delta_rho=0; int node0, node1, node2, node3, tetraNo; for(j=unique_neighbours_index[ids[index]];j>>(ids_d, unique_neighbours_array_d, unique_number_neighbours_d, unique_neighbours_index_d, neighbours_array_d, neighbours_array_ids_d, neighbours_array_index_d, number_neighbours_d, disp_d, vert_d, initDensities_d, divigden_d, nodes, t); CUDA_SAFE_CALL( cudaThreadSynchronize() ); CUT_CHECK_ERROR("Kernel execution failed\n"); CUT_SAFE_CALL( cutStopTimer( timer)); printf("Processing time: %f (ms)\n", cutGetTimerValue( timer)); CUT_SAFE_CALL( cutDeleteTimer( timer)); CUDA_SAFE_CALL(cudaMemcpy(divigden, divigden_d, sizeof(float)*nodes, cudaMemcpyDeviceToHost)); printf("doing free\n"); CUDA_SAFE_CALL(cudaFree(ids_d)); CUDA_SAFE_CALL(cudaFree(unique_neighbours_array_d)); CUDA_SAFE_CALL(cudaFree(unique_number_neighbours_d)); CUDA_SAFE_CALL(cudaFree(unique_neighbours_index_d)); CUDA_SAFE_CALL(cudaFree(neighbours_array_d)); CUDA_SAFE_CALL(cudaFree(neighbours_array_ids_d)); CUDA_SAFE_CALL(cudaFree(neighbours_array_index_d)); CUDA_SAFE_CALL(cudaFree(number_neighbours_d)); CUDA_SAFE_CALL(cudaFree(disp_d)); CUDA_SAFE_CALL(cudaFree(vert_d)); CUDA_SAFE_CALL(cudaFree(initDensities_d)); CUDA_SAFE_CALL(cudaFree(divigden_d)); return divigden; } /************************************************************************/ /* HelloCUDA */ /************************************************************************/ int main(int argc, char* argv[]) { if(!InitCUDA()) { return 0; } int * idArray; int * una; int * unn; int * uni; int * na; int * nai; int * naindx; int * nn; float * disp; float * vert; float * initDensities; float * divigden; int nodes = 19224*4; int t =0; int idLength = 8700; idArray = new int [nodes]; una = new int [nodes*3]; unn = new int [idLength]; uni = new int [idLength]; na = new int [nodes*4]; nai= new int [nodes*4]; naindx= new int [idLength]; ; nn = new int [idLength]; ; disp = new float[nodes*30]; vert = new float[nodes*3]; initDensities = new float[nodes]; divigden = new float[nodes]; denisityInitialisation(idArray, una, unn, uni, na, nai,naindx, nn, idLength, disp,vert, initDensities, divigden, nodes, t); return 0; }