做了这么久的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.添加以下代码
- <ToolFiles>
- <ToolFile RelativePath=".\Cuda.rules" />
- ToolFiles>
5.正常打开*.sln,在任何一个代码文件(*.c,*.h,*.cpp,*.cu)都可以看见使用nvcc的编译方式了,而且配置很方便。对于*.cu文件,它会自动使用Cuda.Rules。
-------------------------------------------------------------------------------------
下面是我的最小的CUDA示例代码,彻底抛弃了cutil的烦恼。
gpu.h文件
- #ifndef MAIN_H
- #define MAIN_H
- void execute( int * const mem_dev , unsigned int length );
- #endif
main.c文件
- #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
- {
- 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
- {
- printf( "array %d = %d\n" , i , mem_host[ i ] );
- }
- //uninit
- cudaFree( mem_dev );
- free( mem_host );
- cudaThreadExit();
- _getch();
- return -1;
- }
gpu.cu文件
- #include "gpu.h"
- __global__ void run( int * const mem_dev )
- {
- // Block index
- int bx = blockIdx.x;
- int by = blockIdx.y;
- // Thread index
- int tx = threadIdx.x;
- int ty = threadIdx.y;
- mem_dev[ bx ] = bx + by + tx + ty;
- }
- void execute( int * const mem_dev , unsigned int length )
- {
- // setup execution parameters
- dim3 threads( length , length );
- dim3 grid( length , length );
- // execute the kernel
- run<<>>( mem_dev );
- }
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22905196/viewspace-623895/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22905196/viewspace-623895/