updated text files
[RBC.git] / brute.cu
index ad106f6..037905c 100644 (file)
--- a/brute.cu
+++ b/brute.cu
@@ -14,7 +14,7 @@
 #include "brute.h"
 #include<stdio.h>
 #include<cuda.h>
-#include<gsl/gsl_sort.h>
+//#include<gsl/gsl_sort.h>
 
 void bruteRangeCount(matrix x, matrix q, real *ranges, unint *cnts){
   matrix dx, dq;
@@ -45,55 +45,46 @@ void bruteSearch(matrix x, matrix q, unint *NNs){
   unint *dMinIDs;
   matrix dx, dq;
 
-  
-  dx.r=x.r; dx.pr=x.pr; dx.c=x.c; dx.pc=x.pc; dx.ld=x.ld;
-  dq.r=q.r; dq.pr=q.pr; dq.c=q.c; dq.pc=q.pc; dq.ld=q.ld;
+  copyAndMove( &dx, &x );
+  copyAndMove( &dq, &q );
 
   checkErr( cudaMalloc((void**)&dMins, q.pr*sizeof(*dMins)) );
   checkErr( cudaMalloc((void**)&dMinIDs, q.pr*sizeof(*dMinIDs)) );
-  checkErr( cudaMalloc((void**)&dx.mat, dx.pr*dx.pc*sizeof(*dx.mat)) );
-  checkErr( cudaMalloc((void**)&dq.mat, dq.pr*dq.pc*sizeof(*dq.mat)) );
-
-  cudaMemcpy(dx.mat,x.mat,x.pr*x.pc*sizeof(*dx.mat),cudaMemcpyHostToDevice);
-  cudaMemcpy(dq.mat,q.mat,q.pr*q.pc*sizeof(*dq.mat),cudaMemcpyHostToDevice);
   
-  nnWrap(dq,dx,dMins,dMinIDs);
+  nnWrap( dq, dx, dMins, dMinIDs );
 
-  cudaMemcpy(NNs,dMinIDs,dq.r*sizeof(*NNs),cudaMemcpyDeviceToHost);
+  cudaMemcpy( NNs, dMinIDs, dq.r*sizeof(*NNs), cudaMemcpyDeviceToHost );
   
-  cudaFree(dMins);
-  cudaFree(dMinIDs);
-  cudaFree(dx.mat);
-  cudaFree(dq.mat);
+  cudaFree( dMins );
+  cudaFree( dMinIDs );
+  cudaFree( dx.mat );
+  cudaFree( dq.mat );
 }
 
 
-void bruteK(matrix x, matrix q, intMatrix NNs){
-  matrix dMins;
+void bruteK(matrix x, matrix q, intMatrix NNs, matrix NNdists){
+  matrix dNNdists;
   intMatrix dMinIDs;
   matrix dx, dq;
   
-  dx.r=x.r; dx.pr=x.pr; dx.c=x.c; dx.pc=x.pc; dx.ld=x.ld;
-  dq.r=q.r; dq.pr=q.pr; dq.c=q.c; dq.pc=q.pc; dq.ld=q.ld;
-  dMins.r=q.r; dMins.pr=q.pr; dMins.c=K; dMins.pc=K; dMins.ld=dMins.pc;
-  dMinIDs.r=q.r; dMinIDs.pr=q.pr; dMinIDs.c=K; dMinIDs.pc=K; dMinIDs.ld=dMinIDs.pc;
-
-  checkErr( cudaMalloc((void**)&dMins.mat, dMins.pc*dMins.pr*sizeof(*dMins.mat)) );
-  checkErr( cudaMalloc((void**)&dMinIDs.mat, dMinIDs.pc*dMinIDs.pr*sizeof(*dMinIDs.mat)) );
-  checkErr( cudaMalloc((void**)&dx.mat, dx.pr*dx.pc*sizeof(*dx.mat)) );
-  checkErr( cudaMalloc((void**)&dq.mat, dq.pr*dq.pc*sizeof(*dq.mat)) );
-
-  cudaMemcpy(dx.mat,x.mat,x.pr*x.pc*sizeof(*dx.mat),cudaMemcpyHostToDevice);
-  cudaMemcpy(dq.mat,q.mat,q.pr*q.pc*sizeof(*dq.mat),cudaMemcpyHostToDevice);
+  copyAndMove( &dx, &x );
+  copyAndMove( &dq, &q );
   
-  knnWrap(dq,dx,dMins,dMinIDs);
+  initMat( &dNNdists, q.r, KMAX );
+  checkErr( cudaMalloc((void**)&dNNdists.mat, sizeOfMatB(dNNdists) ) );
 
-  cudaMemcpy(NNs.mat,dMinIDs.mat,NNs.pr*NNs.pc*sizeof(*NNs.mat),cudaMemcpyDeviceToHost);
+  initIntMat( &dMinIDs, q.r, KMAX );
+  checkErr( cudaMalloc((void**)&dMinIDs.mat, sizeOfIntMatB(dMinIDs) ) );
+
+  knnWrap( dq, dx, dNNdists, dMinIDs );
+
+  cudaMemcpy( NNs.mat, dMinIDs.mat, sizeOfIntMatB(NNs), cudaMemcpyDeviceToHost );
+  cudaMemcpy( NNdists.mat, dNNdists.mat, sizeOfMatB(NNdists), cudaMemcpyDeviceToHost );
   
-  cudaFree(dMins.mat);
-  cudaFree(dMinIDs.mat);
-  cudaFree(dx.mat);
-  cudaFree(dq.mat);
+  cudaFree( dNNdists.mat );
+  cudaFree( dMinIDs.mat );
+  cudaFree( dx.mat );
+  cudaFree( dq.mat );
 }
 
 
@@ -121,32 +112,36 @@ void bruteCPU(matrix X, matrix Q, unint *NNs){
 }
 
 
-void bruteKCPU(matrix x, matrix q, intMatrix NNs){
-  int i, j;
-
-  float **d;
-  d = (float**)calloc(q.pr, sizeof(*d));
-  size_t **t;
-  t = (size_t**)calloc(q.pr, sizeof(*t));
-  for( i=0; i<q.pr; i++){
-    d[i] = (float*)calloc(x.pr, sizeof(**d));
-    t[i] = (size_t*)calloc(x.pr, sizeof(**t));
-  }
-
-  //#pragma omp parallel for private(j)
-  for( i=0; i<q.r; i++){
-    for( j=0; j<x.r; j++)
-      d[i][j] = distVec( q, x, i, j );
-    gsl_sort_float_index(t[i], d[i], 1, x.r);
-    for ( j=0; j<K; j++)
-      NNs.mat[IDX( i, j, NNs.ld )] = t[i][j];
-  }
-
-  for( i=0; i<q.pr; i++){
-    free(t[i]);
-    free(d[i]);
-  }
-  free(t);
-  free(d);
-}
+//The following method works properly, but requires the GNU scientific
+//library.  If you want to use it, uncomment the code, uncomment the include
+//above, and adjust the makefile.  It was used for debugging purposes, but
+//is not required by anything else.
+
+/* void bruteKCPU(matrix x, matrix q, intMatrix NNs){ */
+/*   int i, j; */
+
+/*   float **d; */
+/*   d = (float**)calloc(q.pr, sizeof(*d)); */
+/*   size_t **t; */
+/*   t = (size_t**)calloc(q.pr, sizeof(*t)); */
+/*   for( i=0; i<q.pr; i++){ */
+/*     d[i] = (float*)calloc(x.pr, sizeof(**d)); */
+/*     t[i] = (size_t*)calloc(x.pr, sizeof(**t)); */
+/*   } */
+
+/*   for( i=0; i<q.r; i++){ */
+/*     for( j=0; j<x.r; j++) */
+/*       d[i][j] = distVec( q, x, i, j ); */
+/*     gsl_sort_float_index(t[i], d[i], 1, x.r); */
+/*     for ( j=0; j<KMAX; j++) */
+/*       NNs.mat[IDX( i, j, NNs.ld )] = t[i][j]; */
+/*   } */
+
+/*   for( i=0; i<q.pr; i++){ */
+/*     free(t[i]); */
+/*     free(d[i]); */
+/*   } */
+/*   free(t); */
+/*   free(d); */
+/* } */
 #endif