OpenCL与CNN篇一:搭建在VS的OpenCL运行环境

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ShiAokai/article/details/72904032

一、关于OpenCL的VS2012项目环境配置

1、首先安装AMD APP SDK,百度搜索这个好像第一条就是官网的下载连接,之后安装目录任意你开心就好;这步之前必须强调一定要安装好显卡驱动,不然之后写OpenCL程序是检测不到平台的。我的本本CPU是i5-2450M,已经不被英特尔抛弃了,显卡是A卡还好AMD有可用的SDK。《OpenCL编程指南》有说安装ATI Stream SDK可我感觉然并栾。安装完系统环境变量如下图,环境变量打开方式:我的电脑-->属性-->高级系统设置-->环境变量。

    image


2、我的参考课本是《OpenCL编成指南》,在VS2012中建立工程,导入第一个示例HelloWorld,主要是后两个文件,打开看一下找到main(),之后顺着慢慢理解,或者我在写一篇我的OpenCL初始化详解。

    image

3.1、项目属性---C/C++ 常规---附加包含目录 添加$(AMDAPPSDKROOT)include;

3.2、项目属性---链接器 输入---附加依赖项 添加 OpenCL.lib;

3.3、项目属性---链接器 常规---附加库目录 添加$(AMDAPPSDKROOT)lib\x86;

3.4、上面完了,找个例程编译一下,如果通过就OK了,后面的内容仅是一些奇葩情况,以及我的解决办法,希望你们不要碰到

        如果编写面向64位操作平台的程序,此处记得更改库目录 $(AMDAPPSDKROOT)lib\x86_64;

    image

4、你或许想找个例程验证一下,这个在本系列的篇三,只要能查询到平台就说明成功;算了这个还是给一个简单的例程吧:

#include "stdafx.h"
#include 
#include 
#include 
using namespace std;

#pragma warning( disable : 4996 )   

cl_platform_id   platform;     
cl_context       context;        
cl_device_id     device;

int main()
{
	printf("\n\nOpenCL_Initing .....");

	cl_int           errNum;
	// 查询平台
	cl_uint          numPlatforms =1;
	cl_platform_id  *platformIds;
	errNum = clGetPlatformIDs( 1, NULL, &numPlatforms);  
	platformIds =(cl_platform_id*)malloc(sizeof(cl_platform_id)*numPlatforms);
	errNum = clGetPlatformIDs( numPlatforms, platformIds, NULL); 
	assert(errNum==CL_SUCCESS);
	/*---------------------------------*/ platform = platformIds[0];

	// 这里选择从平台中查询设备
	cl_uint       numDevices =1;
	cl_device_id  *deviceIds;
	errNum = clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);
	deviceIds =(cl_device_id*)malloc(sizeof(cl_device_id)*numDevices);
	errNum = clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU, numDevices, deviceIds, NULL);
	assert(errNum==CL_SUCCESS);
	/*---------------------------------*/ device = deviceIds[0];

	//打印设备信息
	char deviceinfo[100];
	
	for(cl_uint i=0; i

5、这里有可能会存在一个奇葩的问题,就是经过的目录配置之后,VS还找不到路径:

   错误1:cl_main.cpp(13): fatal error C1083: 无法打开包括文件:“CL/cl.h”: No such file or directory

   错误2:LINK : fatal error LNK1104: 无法打开文件“OpenCL.lib”

   可能要在附加包含目录的路径加个"\"   $(AMDAPPSDKROOT)\include

   或者附加库目录的路径加一个"\"      $(AMDAPPSDKROOT)\lib\x86

   不记得我是这样还是重启解决的,不过一般你们的电脑不会像我的那么挫,应该不会有奇葩的反应;而且后来好像这样也不得行,我就干脆把系统变量改成了绝对路径,笑Cry····

    image 

6、不过3.1~3.3的配置是只是用于单个项目;对于一个解决方案我们多个项目,需要相同配置,这就需要全局配置(百度搜索这个有很多教程啊):

     即 通过属性管理器配置(可在视图内打开):然后选择下图一中任一个标记的位置都可以打开MicrosoftCpp.Win32.user进行属性配置(同3.1~3.3),这个配置对新建所有项目可用,应该是这样哈,弄完了检查一下就晓得了。

    image image

二、一些其他的错误

1、关于VS在x64调试,可能会出现“远程调试监视器MSVSMON.EXE似乎没有在远程计算机上运行”的问题

      我只想说也不用先着急着搜索解决办法,或许重启一下就解决了,反正我搜到的办法没怎么有用。至于小伙伴说“关闭防火墙”,好像有时候可以解决一点问题;不过我不敢这么搞,电脑重要资料较多,不想被“Wanna Cry”。

2、直接编译会有报错:helloworld.cpp(119): error C4996: 'clCreateCommandQueue': 被声明为已否决

      解决方法:需要在vs里代码里定义一个宏加入#pragma warning( disable : 4996 )

      问题说明:在OpenCL2.0clCreateCommandQueue()已经被弃用了;

   Explain: The clCreateCommandQueue function was deprecated as of OpenCL 2.0, and replaced with clCreateCommandQueueWithProperties. If you are only targeting devices that support OpenCL 2.0 (some recent Intel and AMD processors at the time of writing), you can safely use this new function.
   If you need your code to run on devices that don't yet support OpenCL 2.0, you can continue using the deprecated clCreateCommandQueue function by using the preprocessor macros that the OpenCL headers provide, e.g:
  
   #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
    #include <CL/cl.h>

3、安装AMP CodeXL并使用VS CodeXL工具调试(Shift+Alt+F5)后,再使用Visual Studio自带的的调试(F5),可能会出现“无可用的源代码”

      解决方法:如下图,在 CodeXL->Breakpoints->New CodeXL Breakpoints 中的 Active BreakPoints中取消所有的中断点,即可使用VS的调试(F5)。

        image

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页