没有GPU也可以仿真CUDA

闲扯

在同学机子上测试了CUDA和OpenCV的结合,但毕竟是在同学的机子上,不能老是占有,现在买新电脑也不划算(还是比较期待工作时公司可以给配个电脑,嘿嘿),尤其是要有独立显卡,笔记本我比较倾向于便携性和较长的待机,性能的话还是要个台式机。

啰嗦了一堆,其实在没有独立显卡的电脑上也是可以编写运行CUDA程序的,工具就是GPU Ocelot模拟器,它仅仅支持__Linux__。cuda-waste倒是支持Windows,我没测试。

遇到的问题

编译Ocelot还是遇到了很多问题的,后来搜到了一篇文章Introduction to Parallel Programming,讲解还是很详细的,可以参考一下。

我主要遇到了3个问题:

.release_build/ocelot/ptxgrammar.hpp:351:14:error:'PTXLexer' is not a member of 'parser'

解决方法就是打开.release_build/ocelot/ptxgrammar.hpp,注释掉355行:

/* int yyparse (parser::PTXLexer& lexer, parser::PTXParser::State& state); */

第二个问题是boost libraries问题,有三个库文件boost_systemboost_filesystemboost_thread要求有个-mt结尾,我把scripts/build_environment.py中的-mt全删了。

第三个问题是LLVM的问题,编译时提示llvm中没有createCFGSimplificationPass()llvm中没有createSimplifyLibCallsPass(),我猜测应该是我安装的llvm做了更新,没有这两个函数了,索性将ocelot/ocelot/executive/implementation/LLVMModuleManager.cpp中的相关行全注释掉了。

然后就可以编译安装了sudo ./build.py --install

安装完成并测试

安装完成后,测试下OcelotConfig -l,输出-locelot就表示没有问题了。

我用前一篇博文中的程序进行了一下测试,在编译前,要将Ocelot配置文件configure.ocelot拷贝到程序所在文件夹,然后就可以编译了。

先用nvcc将cuda程序文件编译成.o的文件:

nvcc -c test_cuda.cu -arch=sm_20 `pkg-config --cflags --libs opencv`
g++ -o test_cuda test_cuda.o -locelot `pkg-config --cflags --libs opencv`

注意要添加-arch=sm_20,否则运行程序时会出现 Cannot parse PTX version 1.4 with version 2.3 parser.的提示。

我在运行测试程序时,应该是弹出窗口显示图片的,但是没有显示窗口,而是出现以下内容:

Xlib:  extension "GLX" missing on display ":0.0".

(test image:18440): GdkGLExt-WARNING **: Window system doesn't support OpenGL.

好吧,既然窗口不支持OpenGL,那把程序中的显示窗口注释掉,改为直接将结果保存成图片(cvSaveImage搞定),重新编译运行,等待大约5s左右,结果图片出现,同时还生成一个文件kernel-times.json,打开看看,内容如下:

{ "application": "cuda.cu", "ISA": "Emulated", "device": "Ocelot PTX Emulator", "kernel": "_Z12transform_myPKhPhi", "sequenceNumberInApplication": 0, "instructions": 208591, "kernelRuntime": 5.42573 }, 

搞定,慢是慢了点,能模拟运行就可以了,终于可以在我的本本上编写CUDA程序了,哈哈,可以加快进度了。