CUDA学习笔记

做了这么久的GPGPU,现在才刚刚开始学CUDA,惭愧惭愧。琢磨了很久matrixMul这个例子,然后又自己新建个工程,加进CudaRule,剥离cutil,终于开始看懂这么一点点了。在这里就想告诉所有和我一样的初学者,不要像我一样一头雾水,走了不少弯路:

        使用CUDA要分清Runtime和Driver。这两种方式是完全不同的。

至于究竟有哪些不同,我还没有学透,不过几个表面上的事实:

        1.Runtime 使用 cudart.lib,而Driver 使用 cuda.lib。相应的函数名称也不一样,Runtime是cudaXXXX开头的,而Driver是cuXXXX开头的。

        2.Runtime可以使用仿真(模拟)的方式运行,而Driver不可以。

        3.Driver有module management,它提供类似C.NET实时编译运行的功能,而Runtime没有。

 

-----------------------------------------------------------------------------------------

        这里顺带提下,我是如何不使用CUDA创建项目的Template来徒手创建项目的。我用的是VS2005。

        1.创建项目。

        2.找到Cuda.Rules文件,放到项目的目录中。

        3.同记事本打开*vcproj文件。

        4.添加以下代码

       

  1. <ToolFiles>  
  2.     <ToolFile RelativePath=".\Cuda.rules" />  
  3. ToolFiles>  

        5.正常打开*.sln,在任何一个代码文件(*.c,*.h,*.cpp,*.cu)都可以看见使用nvcc的编译方式了,而且配置很方便。对于*.cu文件,它会自动使用Cuda.Rules。

-------------------------------------------------------------------------------------

下面是我的最小的CUDA示例代码,彻底抛弃了cutil的烦恼。

gpu.h文件

  1. #ifndef MAIN_H  
  2. #define MAIN_H  
  3.   
  4. void execute( int * const mem_dev , unsigned int length );  
  5.   
  6. #endif  
#ifndef MAIN_H #define MAIN_H void execute( int * const mem_dev , unsigned int length ); #endif

 

 

main.c文件

  1. #pragma comment( lib , "cudart.lib" )  
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include "gpu.h"  
  7.   
  8. #define LENGTH 4  
  9.   
  10. // This function returns the best GPU (with maximum GFLOPS)  
  11. inline int cutGetMaxGflopsDeviceId()  
  12. {  
  13.     int device_count = 0;  
  14.     cudaGetDeviceCount( &device_count );  
  15.   
  16.     cudaDeviceProp device_properties;  
  17.     int max_gflops_device = 0;  
  18.     int max_gflops = 0;  
  19.       
  20.     int current_device = 0;  
  21.     cudaGetDeviceProperties( &device_properties, current_device );  
  22.     max_gflops = device_properties.multiProcessorCount * device_properties.clockRate;  
  23.     ++current_device;  
  24.   
  25.     while( current_device 
  26.     {  
  27.         cudaGetDeviceProperties( &device_properties, current_device );  
  28.         int gflops = device_properties.multiProcessorCount * device_properties.clockRate;  
  29.         if( gflops > max_gflops )  
  30.         {  
  31.             max_gflops        = gflops;  
  32.             max_gflops_device = current_device;  
  33.         }  
  34.         ++current_device;  
  35.     }  
  36.   
  37.     return max_gflops_device;  
  38. }  
  39.   
  40. int main()  
  41. {  
  42.     //init device  
  43.     cudaSetDevice( cutGetMaxGflopsDeviceId() );  
  44.   
  45.     //init space  
  46.     unsigned int size = LENGTH * sizeofint );  
  47.     int * mem_host = ( int * ) malloc( size );  
  48.     int * mem_dev = NULL;  
  49.   
  50.     cudaMalloc( ( void * * ) &mem_dev , size );  
  51.   
  52.     //run  
  53.     execute( mem_dev , LENGTH );  
  54.   
  55.     // copy result from device to host  
  56.     cudaMemcpy( mem_host , mem_dev , size , cudaMemcpyDeviceToHost );  
  57.     //output  
  58.     forint i = 0 ; i 
  59.     {  
  60.         printf( "array %d = %d\n" , i , mem_host[ i ] );  
  61.     }  
  62.   
  63.     //uninit  
  64.     cudaFree( mem_dev );  
  65.     free( mem_host );  
  66.   
  67.     cudaThreadExit();  
  68.   
  69.     _getch();  
  70.     return -1;  
  71. }  
#pragma comment( lib , "cudart.lib" ) #include #include #include #include #include "gpu.h" #define LENGTH 4 // This function returns the best GPU (with maximum GFLOPS) inline int cutGetMaxGflopsDeviceId() { int device_count = 0; cudaGetDeviceCount( &device_count ); cudaDeviceProp device_properties; int max_gflops_device = 0; int max_gflops = 0; int current_device = 0; cudaGetDeviceProperties( &device_properties, current_device ); max_gflops = device_properties.multiProcessorCount * device_properties.clockRate; ++current_device; while( current_device < device_count ) { cudaGetDeviceProperties( &device_properties, current_device ); int gflops = device_properties.multiProcessorCount * device_properties.clockRate; if( gflops > max_gflops ) { max_gflops = gflops; max_gflops_device = current_device; } ++current_device; } return max_gflops_device; } int main() { //init device cudaSetDevice( cutGetMaxGflopsDeviceId() ); //init space unsigned int size = LENGTH * sizeof( int ); int * mem_host = ( int * ) malloc( size ); int * mem_dev = NULL; cudaMalloc( ( void * * ) &mem_dev , size ); //run execute( mem_dev , LENGTH ); // copy result from device to host cudaMemcpy( mem_host , mem_dev , size , cudaMemcpyDeviceToHost ); //output for( int i = 0 ; i < LENGTH ; ++i ) { printf( "array %d = %d\n" , i , mem_host[ i ] ); } //uninit cudaFree( mem_dev ); free( mem_host ); cudaThreadExit(); _getch(); return -1; }

 

gpu.cu文件

  1. #include "gpu.h"  
  2.   
  3. __global__ void run( int * const mem_dev )  
  4. {  
  5.     // Block index  
  6.     int bx = blockIdx.x;  
  7.     int by = blockIdx.y;  
  8.   
  9.     // Thread index  
  10.     int tx = threadIdx.x;  
  11.     int ty = threadIdx.y;  
  12.       
  13.     mem_dev[ bx ] = bx + by + tx + ty;  
  14. }  
  15.   
  16.   
  17. void execute( int * const mem_dev , unsigned int length )  
  18. {  
  19.     // setup execution parameters  
  20.     dim3 threads( length , length );  
  21.     dim3 grid( length , length );  
  22.   
  23.     // execute the kernel  
  24.     run<<>>( mem_dev );  

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22905196/viewspace-623895/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22905196/viewspace-623895/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>