title: Finding minimum distance between n points in cuda
body: <p>I am trying to find the minimum distance between n points in cuda. I wrote the below code. This is working fine for number of points from 1 to 1024 i.e., 1 block. But if num_points is greater than 1024 i am getting wrong value for minimum distance. I am checking the gpu min value with the value I found in CPU using brute force algorithm.
  The min value is stored in the temp1[0] at the end of kernel function.</p>
  
  <p>I don't know what is wrong in this. Please help me out..</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;math.h&gt;
  #include &lt;sys/time.h&gt;
  #define MAX_POINTS 50000
  
  __global__ void minimum_distance(float * X, float * Y, float * D, int n) {
  
  __shared__ float temp[1024];
  float temp1[1024];
  int tid = threadIdx.x;
  int bid = blockIdx.x;
  int ref = tid+bid*blockDim.x;
  temp[ref] = 1E+37F;
  temp1[bid] = 1E+37F;
  float dx,dy;
  float Dij;
  int i;
  
              //each thread will take a point and find min dist to all
              // points greater than its unique id(ref)
      for (i = ref + 1; i &lt; n; i++) 
      {
          dx = X[ref]-X[i];
          dy = Y[ref]-Y[i];
          Dij = sqrtf(dx*dx+dy*dy);
          if (temp[tid] &gt; Dij)
          {
           temp[tid] = Dij;
          }
      }   
  
      __syncthreads();
  
              //In each block the min value is stored in temp[0]
      if(tid == 0)
      {
          if( bid == (n-1)/1024 ) {
          int end = n - (bid) * 1024;
          for (i = 1; i &lt; end; i++ )   
          {
              if (temp[i] &lt; temp[tid])
              temp[tid] = temp[i];
          }
          temp1[bid] = temp[tid];
          }
          else {
          for (i = 1; i &lt; 1024; i++ )   
          {
              if (temp[i] &lt; temp[tid])
              temp[tid] = temp[i];
          }
          temp1[bid] = temp[tid];
          }   
      }
  
  __syncthreads();
  
      //Here the min value is stored in temp1[0]
  if (ref == 0)
  {
      for (i = 1; i &lt;= (n-1)/1024; i++)
          if( temp1[bid] &gt; temp1[i])
              temp1[bid] = temp1[i];
  
      *D=temp1[bid];
  }
  }
  
  //part of Main function 
  //kernel function invocation
  // Invoking kernel of 1D grid and block sizes  
  // Vx and Vy are arrays of x-coordinates and y-coordinates respectively  
  
  int main(int argc, char* argv[]) {
  .
  .
  blocks = (num_points-1)/1024 + 1;
  minimum_distance&lt;&lt;&lt;blocks,1024&gt;&gt;&gt;(Vx,Vy,dmin_dist,num_points);
  .
  .
  </code></pre>