 
   unsigned char* data = create_data();
 
-  printf("Data created");
+  //printf("Data created");
 
   unsigned char* region = grow_region_serial(data);
 
-  printf("Region grown");
-
-  unsigned char* image = raycast_serial(data, region);
+  //printf("Region grown");
+
+  unsigned char* image = raycast_gpu(data, region);
 
   write_bmp(image, IMAGE_DIM, IMAGE_DIM);
 }

  return a;
}

__global__ float3 scale(float3 a, float b){
  a.x *= b;
  a.y *= b;
  a.z *= b;

  cudaMalloc( (void**)&data_device, DATA_DIM*DATA_DIM*DATA_DIM*sizeof(unsigned char));
  cudaMalloc( (void**)&region_device, DATA_DIM*DATA_DIM*DATA_DIM*sizeof(unsigned char));
  cudaMalloc( (void**)&image_device,DATA_DIM*DATA_DIM*sizeof(unsigned char));
  cudaMemcpy( data_device, data, DATA_DIM*DATA_DIM*DATA_DIM*sizeof(unsigned char), cudaMemcpyHostToDevice);
  cudaMemcpy( region_device, region, DATA_DIM*DATA_DIM*DATA_DIM*sizeof(unsigned char), cudaMemcpyHostToDevice);
  cudaMemcpy( image_device, image, DATA_DIM*DATA_DIM*sizeof(unsigned char), cudaMemcpyHostToDevice);

  dim3 dimBlock( 32, 32 );
  dim3 dimGrid( 16, 16 );

  raycast_kernel<<<dimGrid, dimBlock>>>(data_device, image_device, region_device);

  cudaMemcpy( image, image_device, DATA_DIM*DATA_DIM*sizeof(unsigned char), cudaMemcpyDeviceToHost);
  cudaFree(data_device);
  cudaFree(region_device);
  cudaFree(image_device);

  return image;
}
