Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. __device__
  2. double gaussian_distribution(int dim,float data[], double mean[], double diagonal_covariance[]){
  3.     double determinant = 1;
  4.     double result;
  5.     double sum = 0;
  6.  
  7.     for (int i = 0; i < dim; i++){
  8.         determinant *= diagonal_covariance[i];
  9.         sum += (data[i] - mean[i]) * (1 / diagonal_covariance[i]) * (data[i] - mean[i]);
  10.     }
  11.     result = 1.0 / (pow(2 * 3.1415926535897931, dim / 2.0) * sqrt(determinant)) * exp(-0.5 * sum);
  12.  
  13.     return result;
  14. }
  15. __global__ void classifica(float *data, int N, int dim, int components,uchar* res, double **mean, double**covariance, double *weight, int road_index){
  16.     int id=blockIdx.x*blockDim.x+threadIdx.x;
  17.     //if(id>N)  return;
  18.     double max=-1;
  19.     int classe;
  20.     for(int i=0;i<components;i++){
  21.         double gauss=gaussian_distribution(dim,data+id, mean[id],covariance[id] );
  22.         double likelihood = weight[i] * gauss;
  23.         if(max<likelihood){
  24.             classe=i;
  25.             max=likelihood;
  26.         }
  27.     }  
  28.     if(classe==road_index)
  29.         res[id]=0;
  30.     else
  31.         res[id]=255;
  32. }
  33.  
  34.  
  35. void Gaussian_Mixture_Model::Classify(float *data, int N, uchar *res, int road_index){
  36.     uchar *tmp;
  37.     int n_blocks=N/256;
  38.     int dim_blocks=256;
  39.     auto t1=chrono::high_resolution_clock::now();
  40.     cudaMalloc(&tmp, N*sizeof(uchar));
  41.     classifica<<<n_blocks,dim_blocks>>>(data, N, dimension_data,number_gaussian_components, tmp, this->mean, this->diagonal_covariance, this->weight, road_index);
  42.     cudaMemcpy(res, tmp, N*sizeof(uchar),cudaMemcpyDeviceToHost);
  43.     cout<<"tempo classifica: "<<chrono::duration_cast<chrono::nanoseconds>(chrono::high_resolution_clock::now()-t1).count()<<endl;
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement