山东华建建设有限公司网站,南京江宁区住房建设局网站,手机app与手机网站的区别,苏州小程序开发企业本专栏是通过注解程序的方法学习OpenCL#xff0c;我觉得一个一个地去抠原理也不是办法#xff0c;干脆直接学习程序#xff0c;然后把相关原理都直接注解到程序语句当中。 原创地址#xff1a;http://blog.csdn.net/kenden23/article/details/14101657 一开始要配置好环境… 本专栏是通过注解程序的方法学习OpenCL我觉得一个一个地去抠原理也不是办法干脆直接学习程序然后把相关原理都直接注解到程序语句当中。 原创地址http://blog.csdn.net/kenden23/article/details/14101657 一开始要配置好环境我的是nvidia所以就按照我的电脑举例AMD应该也差不多。 1. 首先要到nvidia网站下载适合你显卡的最新驱动安装好 2. 还是在nvidia网站下载好CUDA开发包安装好 3. 如果默认安装路径的话路径应该是在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0 4. 打开这个目录会发现里面有include和lib文件夹这就是我们需要配置在visual studio中的文件 5. 打开visual studio版本基本都无关系我用的是vs2012新建一个win32空项目。按下altF7打开项目属性也可以点击项目文件右键选择属性。 6. 在属性页里面找到“C/C”的“常规”项点击右边有“附加包含目录”然后编辑添加目录C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include 7.在属性页里面找到“连接器”点击其“常规”项右边有“附加库目录”然后也是编辑添加目录C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\Win32如果是64位系统可以是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64。 8. 在属性页里找到“常规”项 右边“附加依赖项”编辑添加lib文件OpenCL.lib 9. 然后就可以新建源文件在源文件里面添加相关的OpenCl程序就可以调试OpenCL程序了。 下面就可以开始学习程序了。 下面是个入门程序已经注释好了注释包括了基本原理的解析可以通过直接阅读和调试程序学习OpenCL了。 本程序是读取电脑中的支持OpenCL的硬件nvidia和intel和AMD等信息然后显示在屏幕上。 [cpp] view plaincopyprint? #include stdio.h #include stdlib.h #include string.h #include iostream #ifdef MAC #include OpenCL/cl.h #else #include CL/cl.h #endif int main() { /* Host data structures */ cl_platform_id *platforms; //每一个cl_platform_id 结构表示一个在主机上的OpenCL执行平台就是指电脑中支持OpenCL的硬件如nvidia显卡intel CPU和显卡AMD显卡和CPU等 cl_uint num_platforms; cl_int i, err, platform_index -1; /* Extension data */ char* ext_data; size_t ext_size; const char icd_ext[] cl_khr_icd; //要使platform工作需要两个步骤。1 需要为cl_platform_id结构分配内存空间。2 需要调用clGetPlatformIDs初始化这些数据结构。一般还需要步骤0询问主机上有多少platforms /* Find number of platforms */ //返回值如果为-1就说明调用函数失败如果为0标明成功 //第二个参数为NULL代表要咨询主机上有多少个platform并使用num_platforms取得实际flatform数量。 //第一个参数为1代表我们需要取最多1个platform。可以改为任意大如INT_MAX整数最大值。但是据说0否则会报错实际测试好像不会报错。下面是步骤0询问主机有多少platforms err clGetPlatformIDs(5, NULL, num_platforms); if(err 0) { perror(Couldnt find any platforms.); exit(1); } printf(I have platforms: %d\n, num_platforms); //本人计算机上显示为2有intel和nvidia两个平台 /* Access all installed platforms */ //步骤1 创建cl_platform_id并分配空间 platforms (cl_platform_id*) malloc(sizeof(cl_platform_id) * num_platforms); //步骤2 第二个参数用指针platforms存储platform clGetPlatformIDs(num_platforms, platforms, NULL); /* Find extensions of all platforms */ //获取额外的平台信息。上面已经取得了平台id了那么就可以进一步获取更加详细的信息了。 //一个for循环获取所有的主机上的platforms信息 for(i0; inum_platforms; i) { /* Find size of extension data */ //也是和前面一样先设置第三和第四个参数为0和NULL然后就可以用第五个参数ext_size获取额外信息的长度了。 err clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS, 0, NULL, ext_size); if(err 0) { perror(Couldnt read extension data.); exit(1); } printf(The size of extension data is: %d\n, ext_size);//我的计算机显示224. /* Access extension data */ //这里的ext_data相当于一个缓存存储相关信息。 ext_data (char*)malloc(ext_size); //这个函数就是获取相关信息的函数第二个参数指明了需要什么样的信息如这里的CL_PLATFORM_EXTENSIONS表示是opencl支持的扩展功能信息。我计算机输出一大串机器比较新专门为了学图形学而购置的电脑支持的东西比较多。 clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS, ext_size, ext_data, NULL); printf(Platform %d supports extensions: %s\n, i, ext_data); //这里是输出生产商的名字比如我显卡信息是NVIDIA CUDA char *name (char*)malloc(ext_size); clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, ext_size, name, NULL); printf(Platform %d name: %s\n, i, name); //这里是供应商信息我显卡信息NVIDIA Corporation char *vendor (char*)malloc(ext_size); clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR, ext_size, vendor, NULL); printf(Platform %d vendor: %s\n, i, vendor); //最高支持的OpenCL版本本机显示OpenCL1.1 CUDA 4.2.1 char *version (char*)malloc(ext_size); clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, ext_size, version, NULL); printf(Platform %d version: %s\n, i, version); //这个只有两个值full profile 和 embeded profile char *profile (char*)malloc(ext_size); clGetPlatformInfo(platforms[i], CL_PLATFORM_PROFILE, ext_size, profile, NULL); printf(Platform %d full profile or embeded profile?: %s\n, i, profile); /* Look for ICD extension */ //如果支持ICD这一扩展功能的platform输出显示本机的Intel和Nvidia都支持这一扩展功能 if(strstr(ext_data, icd_ext) ! NULL) platform_index i; std::coutPlatform_index platform_indexstd::endl; /* Display whether ICD extension is supported */ if(platform_index -1) printf(Platform %d supports the %s extension.\n, platform_index, icd_ext); std::coutstd::endl; //释放空间 free(ext_data); free(name); free(vendor); free(version); free(profile); } if(platform_index -1) printf(No platforms support the %s extension.\n, icd_ext); /* Deallocate resources */ free(platforms); return 0; } 每个电脑的输出结果不一样的我电脑的输出结果是