命令行方式实现第一个CUDA程序的运行(Win7环境)

     看CUDA 方面的资料也有些时日了,关于CUDA的环境配置网上也有很多比如:Visual Studio 2008 + Visual Assist X的CUDA2.3编译环境设置 开勇哥的CUDA VS2005 Wizard 等等,主要是针对VS集成开发环境的配置,而关于命令行方式的很少。我想也有很多人跟我一样也尝试过,但在其间遇到了很大的困难,不得不终止。

     我用的机子是其他牌子的集成显卡,不支持CUDA构架。当时安装了CUDA的3.1版的Toolkit和SDK,驱动是没法安半装的。只好模拟方式运行了,试了很久才发现3.1版或之后的版本不再支持模拟了。嗯,又下了个2.3版的,这下支持了。在集成开发环境VS下设置成模拟方式运行没问题。觉得不过隐,想着能不能用命令行批处理之类的实现编译呢?这个想法不打紧,可花了不少时间才有所收获,细说起来主要有以下障碍:

 

1.fatal error C1083:Cannot open compiler generated file:'Debug/sample.obj':No such file or directory

 

环境变量设置好了,运行下面的命令:

nvcc.exe -ccbin "D:/Visual Studio 2005/VC/bin" -deviceemu -c -DWIN32 -D_DEBUG -D_CONSOLE -Xcompiler "/EHsc /W3 /nologo /Wp64 /Od /Zi /RTC1 /MTd " -IC:/CUDA/include -o Debug/sample.obj sample.cu

 

出现了1中的问题,说找不到文件sample.obj,在网上搜了下,有说什么什么BUG,其实是路径问题,直接将Debug/sample.obj 改为sample.obj 当前目录下,就不怕找不到了。

 

2. 无法启动此程序,因为计算机中丢失mspdb80.dll。尝试重新安装该程序以解决此问题。

 

前面一句是主要的,后面一句是误导。既然找不到,我们就帮它找啦,发现在VS/Common7/IDE目录下有mspdb80.dll,把它复制到VS/VC/bin目录中即可。

 

3.fatal error C1902: Program database manager mismatch; please check your installation

VS有时很奇怪,明明运行好好的,过一些时日却出现问题了,当时就出现了这问题。nvcc.exe的时候没问题(因为bin目录下有mspdb80.dll),可在link 的时候却出现了问题3(也不一定都出现),没办法在链接的时候又把bin目录下的mspdb80.dll删了,才成功。

 

sample.cu如下:

/******************************************************************** * [!output PROJECT_NAME].cu * This is a example of the CUDA program. *********************************************************************/ #include #include #include #pragma warning(disable:4996) /************************************************************************/ /* Init CUDA */ /************************************************************************/ bool InitCUDA(void) { int count = 0; int i = 0; cudaGetDeviceCount(&count); if(count == 0) { fprintf(stderr, "There is no device./n"); return false; } for(i = 0; i < count; i++) { cudaDeviceProp prop; if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) { if(prop.major >= 1) { break; } } } if(i == count) { fprintf(stderr, "There is no device supporting CUDA 1.x./n"); return false; } cudaSetDevice(i); return true; } /************************************************************************/ /* Example */ /************************************************************************/ __global__ static void HelloCUDA(char* result, int num, clock_t* time) { int i = 0; char p_HelloCUDA[] = "Hello CUDA!"; clock_t start = clock(); for(i = 0; i < num; i++) { result[i] = p_HelloCUDA[i]; } *time = clock() - start; } int main(int argc, char** argv) { char *device_result = 0; clock_t *time = 0; char host_result[12] ={0}; clock_t time_used = 0; if(!InitCUDA()) { return 0; } printf("CUDA initialized./n"); cudaMalloc((void**) &device_result, sizeof(char) * 11); cudaMalloc((void**) &time, sizeof(clock_t)); HelloCUDA<<<1, 1, 0>>>(device_result, 11 , time); cudaMemcpy(&host_result, device_result, sizeof(char) * 11, cudaMemcpyDeviceToHost); cudaMemcpy(&time_used, time, sizeof(clock_t), cudaMemcpyDeviceToHost); cudaFree(device_result); cudaFree(time); printf("%s,%d/n", host_result, time_used); return 0; }

命令行批处理形式如下(保存为**.bat即可):

@echo off set myFun=sample set VS=D:/Visual Studio 2005 set CU=C:/CUDA set include=%CU%/include;%VS%/VC/include;%VS%/VC/PlatformSDK/include set lib=%CU%/lib;%VS%/VC/lib;%VS%/VC/PlatformSDK/lib set path=%CU%/bin;%VS%/VC/bin;%VS%/VC/PlatformSDK/bin;%path% echo ------------------===By GoldenSpider 2010-7-9===------------------ echo on nvcc.exe -ccbin "%VS%/VC/bin" -deviceemu -c -DWIN32 -D_DEBUG -D_CONSOLE -Xcompiler "/EHsc /W3 /nologo /Wp64 /Od /Zi /MTd " -I%CU%/include -o "%myFun%.obj" %myFun%.cu @echo off copy "%VS%/Common7/IDE/mspdb80.dll" "%VS%/VC/bin" echo on link /OUT:"mycuda.exe" /LIBPATH:"%CU%/lib" /SUBSYSTEM:CONSOLE /MACHINE:X86 %myFun%.obj cudart.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib bufferoverflowU.lib @echo off del vc80.pdb del %myFun%.obj del "%VS%/VC/bin/mspdb80.dll" echo Good Job, Compiler Success!! Run EXE(Y/?) pause mycuda.exe pause

 运行情况如下:

 

 

你可能感兴趣的:(CUDA)