详细程序注解学OpenCL一 环境配置和入门程序

本专栏是通过注解程序的方法学习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空项目。按下alt+F7打开项目属性,也可以点击项目文件右键,选择属性。

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?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <iostream>  
  5.   
  6. #ifdef MAC  
  7. #include <OpenCL/cl.h>  
  8. #else  
  9. #include <CL/cl.h>  
  10. #endif  
  11.   
  12. int main() {  
  13.   
  14.     /* Host data structures */  
  15.     cl_platform_id *platforms;  
  16.     //每一个cl_platform_id 结构表示一个在主机上的OpenCL执行平台,就是指电脑中支持OpenCL的硬件,如nvidia显卡,intel CPU和显卡,AMD显卡和CPU等  
  17.     cl_uint num_platforms;  
  18.     cl_int i, err, platform_index = -1;  
  19.   
  20.     /* Extension data */  
  21.     char* ext_data;                           
  22.     size_t ext_size;     
  23.     const char icd_ext[] = "cl_khr_icd";  
  24.   
  25.     //要使platform工作,需要两个步骤。1 需要为cl_platform_id结构分配内存空间。2 需要调用clGetPlatformIDs初始化这些数据结构。一般还需要步骤0:询问主机上有多少platforms  
  26.   
  27.     /* Find number of platforms */  
  28.     //返回值如果为-1就说明调用函数失败,如果为0标明成功  
  29.     //第二个参数为NULL代表要咨询主机上有多少个platform,并使用num_platforms取得实际flatform数量。  
  30.     //第一个参数为1,代表我们需要取最多1个platform。可以改为任意大如:INT_MAX整数最大值。但是据说0,否则会报错,实际测试好像不会报错。下面是步骤0:询问主机有多少platforms  
  31.     err = clGetPlatformIDs(5, NULL, &num_platforms);          
  32.     if(err < 0) {          
  33.         perror("Couldn't find any platforms.");           
  34.         exit(1);                              
  35.     }                                     
  36.   
  37.     printf("I have platforms: %d\n", num_platforms); //本人计算机上显示为2,有intel和nvidia两个平台  
  38.   
  39.     /* Access all installed platforms */  
  40.     //步骤1 创建cl_platform_id,并分配空间  
  41.     platforms = (cl_platform_id*)                     
  42.         malloc(sizeof(cl_platform_id) * num_platforms);   
  43.     //步骤2 第二个参数用指针platforms存储platform  
  44.     clGetPlatformIDs(num_platforms, platforms, NULL);         
  45.   
  46.     /* Find extensions of all platforms */  
  47.     //获取额外的平台信息。上面已经取得了平台id了,那么就可以进一步获取更加详细的信息了。  
  48.     //一个for循环获取所有的主机上的platforms信息  
  49.     for(i=0; i<num_platforms; i++)   
  50.     {  
  51.         /* Find size of extension data */  
  52.         //也是和前面一样,先设置第三和第四个参数为0和NULL,然后就可以用第五个参数ext_size获取额外信息的长度了。  
  53.         err = clGetPlatformInfo(platforms[i],             
  54.             CL_PLATFORM_EXTENSIONS, 0, NULL, &ext_size);      
  55.         if(err < 0)   
  56.         {  
  57.             perror("Couldn't read extension data.");              
  58.             exit(1);  
  59.         }     
  60.   
  61.         printf("The size of extension data is: %d\n", ext_size);//我的计算机显示224.  
  62.   
  63.         /* Access extension data */    
  64.         //这里的ext_data相当于一个缓存,存储相关信息。  
  65.         ext_data = (char*)malloc(ext_size);   
  66.         //这个函数就是获取相关信息的函数,第二个参数指明了需要什么样的信息,如这里的CL_PLATFORM_EXTENSIONS表示是opencl支持的扩展功能信息。我计算机输出一大串,机器比较新(专门为了学图形学而购置的电脑),支持的东西比较多。  
  67.         clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS,       
  68.             ext_size, ext_data, NULL);                
  69.         printf("Platform %d supports extensions: %s\n", i, ext_data);  
  70.   
  71.         //这里是输出生产商的名字,比如我显卡信息是:NVIDIA CUDA  
  72.         char *name = (char*)malloc(ext_size);  
  73.         clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME,     
  74.             ext_size, name, NULL);                
  75.         printf("Platform %d name: %s\n", i, name);  
  76.   
  77.         //这里是供应商信息,我显卡信息:NVIDIA Corporation  
  78.         char *vendor = (char*)malloc(ext_size);  
  79.         clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR,       
  80.             ext_size, vendor, NULL);                  
  81.         printf("Platform %d vendor: %s\n", i, vendor);  
  82.   
  83.         //最高支持的OpenCL版本,本机显示:OpenCL1.1 CUDA 4.2.1  
  84.         char *version = (char*)malloc(ext_size);  
  85.         clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION,      
  86.             ext_size, version, NULL);                 
  87.         printf("Platform %d version: %s\n", i, version);  
  88.   
  89.         //这个只有两个值:full profile 和 embeded profile  
  90.         char *profile = (char*)malloc(ext_size);  
  91.         clGetPlatformInfo(platforms[i], CL_PLATFORM_PROFILE,      
  92.             ext_size, profile, NULL);                 
  93.         printf("Platform %d full profile or embeded profile?: %s\n", i, profile);  
  94.   
  95.         /* Look for ICD extension */     
  96.         //如果支持ICD这一扩展功能的platform,输出显示,本机的Intel和Nvidia都支持这一扩展功能  
  97.         if(strstr(ext_data, icd_ext) != NULL)   
  98.             platform_index = i;  
  99.         std::cout<<"Platform_index = "<<platform_index<<std::endl;  
  100.         /* Display whether ICD extension is supported */  
  101.         if(platform_index > -1)  
  102.             printf("Platform %d supports the %s extension.\n",   
  103.             platform_index, icd_ext);  
  104.   
  105.         std::cout<<std::endl;  
  106.   
  107.         //释放空间  
  108.         free(ext_data);  
  109.         free(name);  
  110.         free(vendor);  
  111.         free(version);  
  112.         free(profile);  
  113.     }  
  114.           
  115.     if(platform_index <= -1)  
  116.         printf("No platforms support the %s extension.\n", icd_ext);  
  117.   
  118.     /* Deallocate resources */  
  119.     free(platforms);  
  120.     return 0;  
  121. }   


每个电脑的输出结果不一样的,我电脑的输出结果是:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 IDEA 在 commit 代码时 git 日志乱码 (提交时填写的中文说明乱码)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.问题描述&#xff1a; idea 开发代码中的 中文正常&#xff0c;但提交到码云时填写的提交日志是乱码。 提交到码云后是这样的&#…

神奇的pdfkit工具——将字符串保存为pdf文件

神奇的pdfkit工具——将字符串保存为pdf文件 1、安装工具包 pip install pdfkit 2、上干货 import pdfkitdef create_pdf(str_data, to_file):将字符串生成pdf文件 # &#xff08;需下载wkhtmltox&#xff09;将程序路径传入config对象config pdfkit.configuration(wkhtmltopd…

OpenCL结构

原标题&#xff1a;从零开始学习OpenCL开发&#xff08;一&#xff09;架构 1 异构计算、GPGPU与OpenCL OpenCL是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算&#xff08;heterogeneous&#xff09;的标准&#xff0c;它是跨平台的。旨在充分利用GP…

docker-compose 使用小例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 只是一个很简单的小例。 1. 原本有的容器 2. docker-compose.yml 写法&#xff1a; gentle 处可以任意写&#xff0c;gentle 是我的项…

AMD GPU+VS2010的OpenCL配置

安装开发环境可以参照DE4-530的OpenCL开发环境搭建&#xff08;最终版&#xff09;&#xff0c;这篇文章的大部分内容转载自&#xff1a;http://www.verydemo.com/demo_c92_i226325.html AMD的Heterogeneous Computing有很多AMD的OpenCL资料&#xff0c;包括各种分析工具&#…

ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

在前面两篇随笔《ABP开发框架前后端开发系列---&#xff08;7&#xff09;系统审计日志和登录日志的管理》和《ABP开发框架前后端开发系列---&#xff08;8&#xff09;ABP框架之Winform界面的开发过程》开始介绍了权限管理的内容&#xff0c;其中只是列出了内部的权限系统的审…

GIL , 线程池 , 同步 , 异步 , 队列 , 事件

一.什么是GIL 官方解释:In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (Howev…

在Windows下使用OpenCL配置

前言 目前&#xff0c;NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL&#xff08;NVIDIA 的正式版 driver 是从自195.62 版开始&#xff0c;而 AMD则是从9.11 版开始&#xff09;。NVIDIA 的正式版 driver 中包含 OpenCL.dll&#xff0c;因此可以直接使用。AMD 到目前为止…

CVE-2019-0708 BlueKeep的扫描和打补丁

2019独角兽企业重金招聘Python工程师标准>>> 简介 CVE-2019-0708 BlueKeep是一个Windows远程桌面服务的远程代码执行漏洞&#xff0c;其危害程度不亚于CVE-2017-0143 EternalBlue&#xff0c;该漏洞影响了某些旧版本的Windows系统。此漏洞是预身份验证&#xff0c;无…

《OpenCL异构计算》新版中译本派送中!

《OpenCL异构计算1.2》新鲜出炉&#xff0c;目前市面上仍一书难求&#xff01;我们已向清华出版社订购到第一批新书。关注异构开发社区&#xff0c;积极参与&#xff0c;就有可能免费获取新书&#xff01; 1.如果您异构社区的老朋友&#xff0c;请关注&#xff1a;10.1假期后我…

查看、关闭当前服务器上启动服务 / 进程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我用 java -jar 的方式启动了一个服务&#xff0c;然后要关闭这个服务 / 进程。 1. ps -aux 查看当前进程&#xff0c;整个列表最 后一…

Booster 系列之——多线程优化

项目地址&#xff1a;github.com/didi/booste… 对于开发者来说&#xff0c;线程管理一直是最头疼的问题之一&#xff0c;尤其是业务复杂的 APP&#xff0c;每个业务模块都有着几十甚至上百个线程&#xff0c;而且&#xff0c;作为业务方&#xff0c;都希望本业务的线程优先级最…

dubbo的底层原理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Duboo基本概念解释 Dubbo是一种分布式服务框架。 Webservice也是一种服务框架&#xff0c;但是webservice并不是分布式的服务框架&…

nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress

实现LNMP 实现环境&#xff1a; 服务版本系统CentOS7.6Mysql5.6.34Nginx1.14.2PHP7.1.30HAProxy1.8.20Keepalived1.3.5NFS1.3.0主机IPMysql_master192.168.37.108Mysql_slave192.168.37.105NginxPHP192.168.37.103NginxPHP192.168.37.104HAProxyKeepalived192.168.37.101HAPro…

Java8函数式编程

最近使用lambda表达式&#xff0c;感觉使用起来非常舒服&#xff0c;箭头函数极大增强了代码的表达能力。于是决心花点时间深入地去研究一下java8的函数式。 一、lambda表达式 先po一个最经典的例子——线程 public static void main(String[] args) {// Java7new Thread(new R…

IntelliJ IDEA 配置JDK

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 IDEA配置JDK 1、点击File -->Project Structure&#xff1b; 2、点击左侧标签页SDKs选项&#xff0c;再点击左上角“”&#xff0c;…

get和post 两种基本请求方式的区别

GET和POST是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中&#xff0c;POST通过request body传递参数。 你可能自己写过无数个GET和POST请求&#xff0c;或者已经看过很多权威网站总结出…

Java异常处理001:Maven clean package时Failed to clean project: Failed to delete

Java异常处理001&#xff1a;Maven打包时Failed to clean project: Failed to delete 异常日志&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) on project fmk-web: Failed to clean project: Failed …

Weekly Contest 141

做了第一道后&#xff0c;看了下中间两道题目&#xff0c;没怎么看懂就先放着&#xff0c;做完最后一道&#xff0c;然后就没时间了。 1089. Duplicate Zeros Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the remaining element…

IntelliJ IDEA 中配置、使用 SVN

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.配置svn 如下图&#xff1a; file -- setting -- version control -- subversion -- 选择 SVN安装路径 -- apply -- OK 2.直接检出…