updated text files
[RBC.git] / brute.cu
index d2377c0..037905c 100644 (file)
--- a/brute.cu
+++ b/brute.cu
@@ -14,6 +14,7 @@
 #include "brute.h"
 #include<stdio.h>
 #include<cuda.h>
+//#include<gsl/gsl_sort.h>
 
 void bruteRangeCount(matrix x, matrix q, real *ranges, unint *cnts){
   matrix dx, dq;
@@ -44,26 +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)) );
+  
+  nnWrap( dq, dx, dMins, dMinIDs );
 
-  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);
+  cudaMemcpy( NNs, dMinIDs, dq.r*sizeof(*NNs), cudaMemcpyDeviceToHost );
   
-  nnWrap(dq,dx,dMins,dMinIDs);
+  cudaFree( dMins );
+  cudaFree( dMinIDs );
+  cudaFree( dx.mat );
+  cudaFree( dq.mat );
+}
+
 
-  cudaMemcpy(NNs,dMinIDs,dq.r*sizeof(*NNs),cudaMemcpyDeviceToHost);
+void bruteK(matrix x, matrix q, intMatrix NNs, matrix NNdists){
+  matrix dNNdists;
+  intMatrix dMinIDs;
+  matrix dx, dq;
   
-  cudaFree(dMins);
-  cudaFree(dMinIDs);
-  cudaFree(dx.mat);
-  cudaFree(dq.mat);
+  copyAndMove( &dx, &x );
+  copyAndMove( &dq, &q );
+  
+  initMat( &dNNdists, q.r, KMAX );
+  checkErr( cudaMalloc((void**)&dNNdists.mat, sizeOfMatB(dNNdists) ) );
+
+  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( dNNdists.mat );
+  cudaFree( dMinIDs.mat );
+  cudaFree( dx.mat );
+  cudaFree( dq.mat );
 }
 
 
@@ -89,4 +110,38 @@ void bruteCPU(matrix X, matrix Q, unint *NNs){
   
   free(dtoNNs);  
 }
+
+
+//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