Blame view

stim/cuda/testKernel.cuh 3.81 KB
84eff8b1   Pavel Govyadinov   Merged only the n...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  #include <assert.h>
  #include <cuda.h>
  #include <cuda_runtime.h>
  #include <stdio.h>
  #include <stim/visualization/colormap.h>
  #include <sstream>
  #include <stim/math/vector.h>
  #include <stim/cuda/cudatools/devices.h>
  #include <stim/cuda/cudatools/threads.h>
  #include <stim/cuda/cuda_texture.cuh>
  	stim::cuda::cuda_texture tx;  //texture object.
  	float* print;
  	
  	///Initialization function, allocates the memory and passes the necessary
  	///handles from OpenGL and Cuda.
  	///@param DIM_Y			--integer controlling how much memory to allocate.
e45b97ce   Pavel Govyadinov   safety commit, I ...
17
  	void initArray(int x, int y)
84eff8b1   Pavel Govyadinov   Merged only the n...
18
  	{
e45b97ce   Pavel Govyadinov   safety commit, I ...
19
  			cudaMalloc( (void**) &print, x*y*sizeof(float));     ///temporary
84eff8b1   Pavel Govyadinov   Merged only the n...
20
21
22
23
24
25
26
27
  	}
  
  	///Deinit function that frees the memery used and releases the texture resource
  	///back to OpenGL.
  	void cleanUP()
  	{
  			cudaFree(print);         ///temporary
  	}  
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
28
29
30
31
  
          __device__
          float templ(int x)                                                                      
          {
c0e09133   Pavel Govyadinov   STABLE: made temp...
32
                  if(x < 32/6 || x > 32*5/6 || (x > 32*2/6 && x < 32*4/6)){
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
33
34
35
36
37
38
                          return 1.0;
                  }else{
                          return 0.0;
                  }
  
          }
84eff8b1   Pavel Govyadinov   Merged only the n...
39
40
41
42
43
44
45
46
47
48
49
50
  		
  	///Find the difference of the given set of samples and the template
  	///using cuda acceleration.
  	///@param stim::cuda::cuda_texture t	--stim texture that holds all the references
  	///					  to the data.
  	///@param float* result			--a pointer to the memory that stores the result.
  	__global__
  	//void get_diff (float *result)
  	void get_diff (cudaTextureObject_t texIn, float *print)
  	{       
  		int x   = threadIdx.x + blockIdx.x * blockDim.x;
  		int y   = threadIdx.y + blockIdx.y * blockDim.y;
c0e09133   Pavel Govyadinov   STABLE: made temp...
51
52
53
  //		int idx = y*64+x;
  		int idx = y*32+x;
  	//	int idx = y*16+x;
84eff8b1   Pavel Govyadinov   Merged only the n...
54
  
59781ee3   Pavel Govyadinov   fixed a stask bug...
55
  		float valIn             = tex2D<unsigned char>(texIn, x, y);
5de3a9c2   Pavel Govyadinov   CHECKPOINT: befo...
56
  		float templa		= templ(x);
e45b97ce   Pavel Govyadinov   safety commit, I ...
57
58
  		print[idx]              = valIn;             ///temporary
  		//print[idx]              = abs(templa);             ///temporary
84eff8b1   Pavel Govyadinov   Merged only the n...
59
60
61
62
63
64
65
66
67
68
  
  	}
  
  
  	///External access-point to the cuda function
  	///@param GLuint texbufferID 	--GLtexture (most be contained in a framebuffer object)
  	///				  that holds the data that will be handed to cuda.
  	///@param GLenum texType	--either GL_TEXTURE_1D, GL_TEXTURE_2D or GL_TEXTURE_3D
  	///				  may work with other gl texture types, but untested.
  	///@param DIM_Y, the number of samples in the template.
e45b97ce   Pavel Govyadinov   safety commit, I ...
69
  	void test(GLint texbufferID, GLenum texType, int x, int y)
84eff8b1   Pavel Govyadinov   Merged only the n...
70
71
72
73
74
75
76
  	{
  
  		//Bind the Texture in GL and allow access to cuda.
  		tx.MapCudaTexture(texbufferID, texType);
  
  		//initialize the return arrays.
  
e45b97ce   Pavel Govyadinov   safety commit, I ...
77
78
79
  		initArray(x,y);
  		dim3 numBlocks(1, y);
  		dim3 threadsPerBlock(x, 1);
84eff8b1   Pavel Govyadinov   Merged only the n...
80
  		int max_threads = stim::maxThreadsPerBlock();
1306fd96   Pavel Govyadinov   minor bug fixes i...
81
82
  		//dim3 threads(max_threads, 1);
  		//dim3 blocks(x / threads.x + 1, y);	
1306fd96   Pavel Govyadinov   minor bug fixes i...
83
84
  		//dim3 numBlocks(2, 2);
  		//dim3 threadsPerBlock(8, 108);
84eff8b1   Pavel Govyadinov   Merged only the n...
85
86
87
88
89
90
91
92
  
  
  //		get_diff <<< blocks, threads >>> (tx.getTexture(), print);
  		get_diff <<< numBlocks, threadsPerBlock >>> (tx.getTexture(), print);
  
  		cudaDeviceSynchronize();
  		stringstream name;      //for debugging
  		name << "FromTex.bmp";
e45b97ce   Pavel Govyadinov   safety commit, I ...
93
  		stim::gpu2image<float>(print, name.str(),x,y,0,255);
84eff8b1   Pavel Govyadinov   Merged only the n...
94
95
96
97
98
  	  
  		tx.UnmapCudaTexture();
  		cleanUP();
  	}
  
c0e09133   Pavel Govyadinov   STABLE: made temp...
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  	void test(GLint texbufferID, GLenum texType, int x, int y, std::string nam)
  	{
  
  		//Bind the Texture in GL and allow access to cuda.
  		tx.MapCudaTexture(texbufferID, texType);
  
  		//initialize the return arrays.
  
  		initArray(x,y);
  		dim3 numBlocks(1, y);
  		dim3 threadsPerBlock(x, 1);
  		int max_threads = stim::maxThreadsPerBlock();
  		//dim3 threads(max_threads, 1);
  		//dim3 blocks(x / threads.x + 1, y);	
  		//dim3 numBlocks(2, 2);
  		//dim3 threadsPerBlock(8, 108);
  
  
  //		get_diff <<< blocks, threads >>> (tx.getTexture(), print);
  		get_diff <<< numBlocks, threadsPerBlock >>> (tx.getTexture(), print);
  
  		cudaDeviceSynchronize();
  		stringstream name;      //for debugging
  		name << nam.c_str();
  		stim::gpu2image<float>(print, name.str(),x,y,0,255);
  	  
  		tx.UnmapCudaTexture();
  		cleanUP();
  	}