Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.53 KB | None | 0 0
  1. // ***********************************************************************
  2. //
  3. // Demo program pro vyuku predmetu APPS (10/2021)
  4. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  5. // email:petr.olivka@vsb.cz
  6. //
  7. // Priklad pouziti CUDA technologie.
  8. // Prevod barevneho obrazku na odstiny sede barvy
  9. //
  10. // ***********************************************************************
  11.  
  12. #include <cuda_runtime.h>
  13. #include <stdio.h>
  14.  
  15. // Demo kernel pro prevod barevneho bodu na odstin sede.
  16. __global__ void kernel_grayscale( uchar4 *color_pic, uchar4* bw_pic, int sizex, int sizey )
  17. {
  18. // souradnice vlakna, kontrola rozmeru obrazku
  19. int y = blockDim.y * blockIdx.y + threadIdx.y;
  20. if ( y >= sizey ) return;
  21. int x = blockDim.x * blockIdx.x + threadIdx.x;
  22. if ( x >= sizex ) return;
  23.  
  24. uchar4 bgr = color_pic[ y * sizex + x ];
  25.  
  26. // vsechny tri barevne slozky budou mit stejnou hodnotu
  27. bgr.x = bgr.y = bgr.z = bgr.x * 0.11 + bgr.y * 0.59 + bgr.z * 0.30;
  28.  
  29. // ulozeni bodu do obrazku
  30. bw_pic[ y * sizex + x ] = bgr;
  31.  
  32. }
  33.  
  34.  
  35.  
  36.  
  37. __global__ void kernel_otoc( uchar4 *color_pic, uchar4* newimg, int sizex, int sizey )
  38. {
  39. // souradnice vlakna, kontrola rozmeru obrazku
  40. int y = blockDim.y * blockIdx.y + threadIdx.y;
  41. if ( y >= sizey ) return;
  42. int x = blockDim.x * blockIdx.x + threadIdx.x;
  43. if ( x > (sizex/2) ) return;
  44.  
  45. int xDruhaPulka = ((sizex/2)-x)+(sizex/2);
  46.  
  47. newimg[ y * sizex + x ] =color_pic[ y * sizex +xDruhaPulka ];
  48. newimg[ y * sizex + xDruhaPulka ] =color_pic[ y * sizex +x ];
  49.  
  50. /*if(sizex%2 != 0)
  51. {
  52. if(x = sizex/2)
  53. newimg[ y * x] =color_pic[ y * +x ];
  54. }*/
  55.  
  56.  
  57. }
  58.  
  59. __global__ void kernel_vyrez(uchar4 *in, uchar4* out, int2 size, int4 vyrez)
  60. {
  61. int y = blockDim.y * blockIdx.y + threadIdx.y;
  62. int x = blockDim.x * blockIdx.x + threadIdx.x;
  63.  
  64. if ( y >= size.y) return;
  65. if ( x >= size.x) return;
  66. out[size.x * y +x] = in[0];
  67.  
  68.  
  69. if ( y >= vyrez.z || y <= vyrez.y) return;
  70. if ( x >= vyrez.w || x <= vyrez.x) return;
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77. /* if ( y >= vyrez.z || y <= vyrez.y) return;
  78. int x = blockDim.x * blockIdx.x + threadIdx.x;
  79. if ( x >= vyrez.w || x <= vyrez.x) return;
  80.  
  81. if ( y >= size.y) return;
  82. int x = blockDim.x * blockIdx.x + threadIdx.x;
  83. if ( x >= size.x) return;
  84. */
  85.  
  86. int souradniceVyrezuX = x - vyrez.x;
  87. int souradniceVyrezuY = y - vyrez.y;
  88.  
  89.  
  90. int vyrezSizex = vyrez.w - vyrez.x;
  91.  
  92. out[vyrezSizex * souradniceVyrezuY + souradniceVyrezuX] = in[size.x * y +x];
  93.  
  94. //out[size.x * y +x] = in[size.x * y +x];
  95.  
  96. }
  97.  
  98. __global__ void kernel_roztrhni(uchar4 *orig, uchar4* newimg1, uchar4* newimg2, int sizex, int sizey)
  99. {
  100. int y = blockDim.y * blockIdx.y + threadIdx.y;
  101. if ( y >= sizey ) return;
  102. int x = blockDim.x * blockIdx.x + threadIdx.x;
  103. if ( x >= sizex) return;
  104.  
  105.  
  106. if(x > sizex/2)
  107. {
  108. newimg1[ y * (sizex/2) + x - (sizex/2) ] = orig[ y * sizex + x ];
  109. }
  110. else
  111. {
  112. newimg2[ y * (sizex/2) + x ] = orig[ y * sizex + x ];
  113. }
  114. }
  115.  
  116. void run_grayscale( uchar4 *original, uchar4* output, int2 size, int4 vyrez)
  117. {
  118. cudaError_t cerr;
  119.  
  120. uchar4 *cudaIN;
  121. uchar4 *cudaOUT;
  122.  
  123. cerr = cudaMalloc( &cudaIN, size.x * size.y * sizeof( uchar4 ) );
  124. if ( cerr != cudaSuccess )
  125. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  126.  
  127.  
  128.  
  129. cerr = cudaMalloc( &cudaOUT, (vyrez.w-vyrez.x) * (vyrez.z-vyrez.y) * sizeof( uchar4 ) );
  130. if ( cerr != cudaSuccess )
  131. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  132.  
  133.  
  134.  
  135. /* cerr = cudaMalloc( &cudaOUT, size.x *size.y * sizeof( uchar4 ) );
  136. if ( cerr != cudaSuccess )
  137. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) ); */
  138.  
  139. // prenos barevneho obrazku do videokarty
  140. cerr = cudaMemcpy( cudaIN, original, size.x * size.y * sizeof( uchar4 ), cudaMemcpyHostToDevice );
  141. if ( cerr != cudaSuccess )
  142. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  143.  
  144.  
  145.  
  146.  
  147. int block = 16;
  148. dim3 blocks(size.x,size.y);
  149. dim3 threads( block, block );
  150.  
  151.  
  152. printf( "predpustenim %d %d\n", size.x, size.y);
  153. printf( "predpustenim %d %d, %d, %d\n", vyrez.x, vyrez.y, vyrez.w, vyrez.z);
  154. // vytvoreni bloku s vlakny, matice vlaken muze byt vetsi, nez samotny obrazek!
  155. kernel_vyrez<<< blocks, threads >>>( cudaIN, cudaOUT, size, vyrez);
  156.  
  157.  
  158. /* cerr = cudaMemcpy(output, cudaOUT, ( size.x )* (size.y) * sizeof( uchar4 ), cudaMemcpyDeviceToHost );
  159. if ( cerr != cudaSuccess )
  160. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) ); */
  161.  
  162.  
  163.  
  164. cerr = cudaMemcpy(output, cudaOUT, (vyrez.w-vyrez.x) * (vyrez.z-vyrez.y) * sizeof( uchar4 ), cudaMemcpyDeviceToHost );
  165. if ( cerr != cudaSuccess )
  166. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  167.  
  168.  
  169. cudaFree( cudaIN );
  170. cudaFree( cudaOUT );
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179. // alokace pameti ve videokarte
  180. /*uchar4 *cudaColorPic;
  181. uchar4 *cudaBWPic;
  182. cerr = cudaMalloc( &cudaColorPic, sizex * sizey * sizeof( uchar4 ) );
  183. if ( cerr != cudaSuccess )
  184. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  185.  
  186. cerr = cudaMalloc( &cudaBWPic, sizex * sizey * sizeof( uchar4 ) );
  187. if ( cerr != cudaSuccess )
  188. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  189.  
  190. // prenos barevneho obrazku do videokarty
  191. cerr = cudaMemcpy( cudaColorPic, color_pic, sizex * sizey * sizeof( uchar4 ), cudaMemcpyHostToDevice );
  192. if ( cerr != cudaSuccess )
  193. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  194.  
  195. int block = 16;
  196. dim3 blocks( ((( sizex + block - 1 ) / block)/2)+1, ( sizey + block - 1 ) / block );
  197. dim3 threads( block, block );
  198.  
  199. // vytvoreni bloku s vlakny, matice vlaken muze byt vetsi, nez samotny obrazek!
  200. kernel_otoc<<< blocks, threads >>>( cudaColorPic, cudaBWPic, sizex, sizey );
  201.  
  202. if ( ( cerr = cudaGetLastError() ) != cudaSuccess )
  203. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  204.  
  205. // prenos dat z videokarty
  206. cerr = cudaMemcpy( bw_pic, cudaBWPic, sizex * sizey * sizeof( uchar4 ), cudaMemcpyDeviceToHost );
  207. if ( cerr != cudaSuccess )
  208. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  209.  
  210.  
  211.  
  212.  
  213. */
  214.  
  215. printf( "OTOC OK" );
  216.  
  217.  
  218.  
  219. // ROZTRZENI
  220. /* uchar4 *cudaImg1;
  221. cerr = cudaMalloc( &cudaImg1, sizex* sizey * sizeof( uchar4 ) );
  222. if ( cerr != cudaSuccess )
  223. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  224.  
  225. uchar4 *cudaImg2;
  226. cerr = cudaMalloc( &cudaImg2, sizex* sizey * sizeof( uchar4 ) );
  227. if ( cerr != cudaSuccess )
  228. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  229.  
  230. printf( "alok OK\n" );
  231.  
  232. block = 16;
  233. dim3 blocks2( (( sizex + block - 1 ) / block), ( sizey + block - 1 ) / block );
  234. dim3 threads2( block, block );
  235.  
  236.  
  237. printf( "predpustenim\n" );
  238. // vytvoreni bloku s vlakny, matice vlaken muze byt vetsi, nez samotny obrazek!
  239. kernel_roztrhni<<< blocks2, threads2 >>>( cudaColorPic, cudaImg1, cudaImg2, sizex, sizey );
  240.  
  241. printf( "pospusteni\n" );
  242.  
  243. cerr = cudaMemcpy( img1, cudaImg1, (sizex/2) * sizey * sizeof( uchar4 ), cudaMemcpyDeviceToHost );
  244. if ( cerr != cudaSuccess )
  245. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  246.  
  247. printf( "ffffffff\n" );
  248.  
  249. cerr = cudaMemcpy( img2, cudaImg2, (sizex/2) * sizey * sizeof( uchar4 ), cudaMemcpyDeviceToHost );
  250. if ( cerr != cudaSuccess )
  251. printf( "CUDA Error [%d] - '%s'\n", __LINE__, cudaGetErrorString( cerr ) );
  252.  
  253. printf( "gggggggggg\n" );
  254. // uvolneni alokovane pameti ve videokarte
  255. cudaFree( cudaImg1 );
  256. cudaFree( cudaImg2 );
  257. printf( "hhhhhh\n" );
  258. cudaFree( cudaColorPic );
  259. cudaFree( cudaBWPic );*/
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement