OpenCL “速成”冲刺【第一天】

话说软件开发从来没有速成一说,一门语言你学的越快,说明你在别的语言上下个功夫越多,所以这次加了引号,只不过几周之后可能会有一个公司内部OpenCL的考核,虽然本人不需要考核,不过也正好借机整理下之前OpenCL的经验,一方面帮着下别的同事,一方面也给自己留点干活。这个教程针对有一点C/C++开发经验的童鞋,如果没有太多经验,我建议还是先去学学C语言。


这个是wiki上OpenCL的定义,我感觉想学OpenCL的人应该都已经知道了。

OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。


第一天,环境,项目,HelloWorld


硬件环境

你需要一台支持OpenCL的设备,AMD,Nvidia的显卡,Intel的CPU(最好带核显),型号不能太老了,3年内的基本没问题。

本次教程将以Intel的CPU配合AMD的显卡为例。


软件环境

操作系统是windows的,下载安装AMDAPPSDK for windows,VS2012(老版本也行,我推荐用新的)。

操作系统是linux的,下载安装AMDAPPSDK for linux,Code::blocks(喜欢VIM的也行,或者说更好)。

下载自己常用的版本控制软件,和C/C++辅助开发软件。

PS:OpenCL也就是库和头文件,各个厂商的SDK也就是OpenCL+Tools+Samples,别的厂商也有相应的SDK,百度“厂商 OpenCL SDK"的关键字组合都能找到。


检测开发环境

安装好AMDAPPSDK之后,在命令行下运行clinfo命令,将显示出你支持OpenCL的硬件信息。

PS:不是AMD的设备,可以用CPUz,GPUz等软件查询是否支持OpenCL。


配置项目

个人认为,既然你已经知道了OpenCL就是库那么应该知道怎么配置项目,否则可能就是不满足有一点C/C++开发经验这个前提了。不过为了方便,还是贴出来。

自己去安装软件的目录下找到OpenCL库文件的位置(一般是C:\Program Files (x86)\AMD APP),linux直接find -name ”opencl“ 命令就行(一般在/opt/AMDAPP下)。

Visual Studio系列(别用VC6,不解释)

项目属性->C++->常规->附加包含目录,把SDK下边的include目录加进去。

项目属性->链接器->常规->附加库目录,把SDK下边的lib/x86_64(x64)目录加进去。

项目属性->链接器->输入->附加依赖项,输入opencl.lib

PS: 安装完SDK,一般会在系统中加入环境变量的,用环境变量配置上边的路径更方便,比如$(AMDAPPSDKROOT)include就解决了,这样换了电脑的话,只要是相同厂商就能通用。

Code::blocks

右键项目->Properties...->Project's build options,输入下边内容

-I/opt/AMDAPP/include  -L/opt/AMDAPP/lib/x86_64  -lOpenCL 

PS: 其实OpenCL就是配置好头文件和库文件,直接粘贴到项目中也行,但是不推荐,换个电脑可能就不好使了。


HelloWorld

本人偷懒就用fixstar的代码了,建立项目,新建c或者cpp文件,粘贴下列代码进去:

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <CL/cl.h>  
  4.   
  5. #define MEM_SIZE (128)  
  6. #define MAX_SOURCE_SIZE (0x100000)  
  7.   
  8. int main()  
  9. {  
  10.     cl_device_id device_id = NULL;  
  11.     cl_context context = NULL;  
  12.     cl_command_queue command_queue = NULL;  
  13.     cl_mem memobj = NULL;  
  14.     cl_program program = NULL;  
  15.     cl_kernel kernel = NULL;  
  16.     cl_platform_id platform_id = NULL;  
  17.     cl_uint ret_num_devices;  
  18.     cl_uint ret_num_platforms;  
  19.     cl_int ret;  
  20.   
  21.     char string[MEM_SIZE];  
  22.   
  23.     FILE *fp;  
  24.     char fileName[] = "./main.cl";  
  25.     char *source_str;  
  26.     size_t source_size;  
  27.   
  28.     /* Load the source code containing the kernel*/  
  29.     fp = fopen(fileName, "r");  
  30.     if (!fp) {  
  31.         fprintf(stderr, "Failed to load kernel.\n");  
  32.         exit(1);  
  33.     }  
  34.     source_str = (char*)malloc(MAX_SOURCE_SIZE);  
  35.     source_size = fread(source_str, 1, MAX_SOURCE_SIZE, fp);  
  36.     fclose(fp);  
  37.   
  38.     /* Get Platform and Device Info */  
  39.     ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);  
  40.     ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices);  
  41.   
  42.     /* Create OpenCL context */  
  43.     context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);  
  44.   
  45.     /* Create Command Queue */  
  46.     command_queue = clCreateCommandQueue(context, device_id, 0, &ret);  
  47.   
  48.     /* Create Memory Buffer */  
  49.     memobj = clCreateBuffer(context, CL_MEM_READ_WRITE,MEM_SIZE * sizeof(char), NULL, &ret);  
  50.     /* Create Kernel Program from the source */  
  51.     program = clCreateProgramWithSource(context, 1, (const char **)&source_str,(const size_t *)&source_size, &ret);  
  52.   
  53.     /* Build Kernel Program */  
  54.     ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);  
  55.   
  56.     /* Create OpenCL Kernel */  
  57.     kernel = clCreateKernel(program, "hello", &ret);  
  58.   
  59.     /* Set OpenCL Kernel Parameters */  
  60.     ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobj);  
  61.   
  62.     /* Execute OpenCL Kernel */  
  63.     ret = clEnqueueTask(command_queue, kernel, 0, NULL,NULL);  
  64.   
  65.     /* Copy results from the memory buffer */  
  66.     ret = clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0,  
  67.         MEM_SIZE * sizeof(char),string, 0, NULL, NULL);  
  68.   
  69.     /* Display Result */  
  70.     puts(string);  
  71.   
  72.     /* Finalization */  
  73.     ret = clFlush(command_queue);  
  74.     ret = clFinish(command_queue);  
  75.     ret = clReleaseKernel(kernel);  
  76.     ret = clReleaseProgram(program);  
  77.     ret = clReleaseMemObject(memobj);  
  78.     ret = clReleaseCommandQueue(command_queue);  
  79.     ret = clReleaseContext(context);  
  80.   
  81.     free(source_str);  
  82.   
  83.     getchar();  
  84.     return 0;  
  85.   
  86. }  

新建文件,后缀改成.cl,粘贴下列代码进去:
[cpp] view plaincopyprint?
  1. __kernel void hello(__global char* string)  
  2. {  
  3.     string[0] = 'H';  
  4.     string[1] = 'e';  
  5.     string[2] = 'l';  
  6.     string[3] = 'l';  
  7.     string[4] = 'o';  
  8.     string[5] = ',';  
  9.     string[6] = ' ';  
  10.     string[7] = 'W';  
  11.     string[8] = 'o';  
  12.     string[9] = 'r';  
  13.     string[10] = 'l';  
  14.     string[11] = 'd';  
  15.     string[12] = '!';  
  16.     string[13] = '\0';  
  17. }  

编译执行文件。


第一天的内容就是这些,明天将讲解上边的代码和OpenCL的组织结构。


作业:阅读上边的代码,解释各个API的含义,写上中文注释(最好别直接翻译),将代码上传到自己的版本管理工具上。


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

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

相关文章

Java8函数式编程

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

电脑如何获得管理员权限

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我只是记录下&#xff0c;方便以后查看。 参见&#xff1a; https://jingyan.baidu.com/article/ab69b270ff426e2ca6189f54.html

.NET混淆器 Dotfuscator如何保护应用程序?控制流了解一下!

Dotfuscator是一个.NET的Obfuscator。它提供企业级的应用程序保护&#xff0c;大大降低了盗版、知识产权盗窃和篡改的风险。Dotfuscator的分层混淆、加密、水印、自动失效、防调试、防篡改、报警和防御技术&#xff0c;为世界各地成千上万的应用程序提供保护。 Dotfuscator提供…

到底什么才是人生最大的投资

不是房子&#xff0c;不是股票&#xff0c; 是人&#xff0c;跟什么人交往&#xff0c;跟随什么人&#xff0c; 交什么样的朋友&#xff0c;其实就是你投资什么人&#xff0c; 而这&#xff0c;是对人生影响最大的。 钱不会给人机会&#xff0c;房子也不会&#xff0c; 只有人会…

tcpdump抓包命令

目录&#xff1a; 命令格式选项expression表达式示例【命令格式】 man手册显示如下 1 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]2 [ -c count ]3 [ -C file_size ] [ -G rotate_seconds ] [ -F file ]4 [ -i …

百度Ueditor编辑器wordimage踩坑

背景 改造公司老项目后台编辑器&#xff0c;使用百度的Ueditor做替换。 发现问题 1、ue编辑器初始化后部分参数无法覆盖ueditor.config.js中的选项。2、wordimage&#xff08;word图片转存&#xff09;始终是灰色&#xff0c;无法使用。解决办法 1、将ueditor.config.js中的inp…

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;或者已经看过很多权威网站总结出…

无论是工作还是生活都要记住这些话

1.如果你不喜欢现在的工作&#xff0c;要么辞职不干&#xff0c;要么就闭嘴不言。初出茅庐&#xff0c;往往眼高手低&#xff0c;心高气傲&#xff0c;大事做不了&#xff0c;小事不愿做。不要养成挑三拣四的习惯。不要雨天烦打伞&#xff0c;不带伞又怕淋雨&#xff0c;处处表…

苏嵌第一天,shell中一些基础知识

一、常用环境变量 1、HOME变量 Linux系统中的每个用户都有一个相关的称作HOME的目录。 2、PATH变量 包含一列用冒号定界的目录的路径名字&#xff0c;便于可执行程序的搜索。 3、PS1变量 PS1变量包含了shell提示符&#xff0c;$符号 4、LOGNAME变量 包含用户的注册名字…

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.直接检出…

切记!职场邮件需注意的细节

电子邮件是如今工作场所重要的通信工具之一&#xff0c;但不是每个人都知道如何很好地使用这个工具。工作邮件也是人际沟通的一种方式&#xff0c;和打电话、面谈一样&#xff0c;有很多学问讲究&#xff0c;所以在发送邮件之前一定要深思熟虑。 【发送&#xff0c;抄送&…

李洋疯狂C语言之初

1.sizeof 是看数据类型所占空间大小&#xff0c;这个大小是以 字节&#xff08;B&#xff09;为单位 char 是C语言的字符数据类型 %d 用在printf 中表示往屏幕打印一个数字 printf ("char&#xff1a; %d\n", sizeof(char)); 数据类型之间的关系&#xff0c;shor…

时时流量查看工具-ifsta,nload,iftop

为什么80%的码农都做不了架构师&#xff1f;>>> 1、ifstat 是一个网络流量监测程序。能查看网卡的流出和流入的字节. 概要&#xff1a;ifstat就像iostat/vmstat描述其它的系统状况一样&#xff0c;是一个统计网络接口活动状态的工具。 参数&#xff1a; -l 监测环路…

10大清宿便排毒方法及简单排毒瘦小腹运动

早上空腹喝水法&#xff1a;每日起床后空腹喝下500C.C.加盐的冷开水。只要是冷的饮料或水分&#xff0c;在肠胃空腹时都有刺激肠胃蠕动的效果&#xff0c;而且越冰刺激效果越好&#xff0c;建议不需加盐&#xff0c;以免高血压患者因盐分中的金属离子造成肾的负担。 优酪乳加绿…

破解 IntelliJ IDEA 、免费注册方法、注册码

1. 找到hosts文件&#xff0c;在此路径下 C:\Windows\System32\drivers\etc 2. 修改hosts 文件&#xff0c;在最后 加一行配置&#xff1a; &#xff08;此操作需要电脑管理员权限&#xff09; 0.0.0.0 account.jetbrains.com 3. 从idea 注册码生成网站生成一组注册码。网…

李洋疯狂C语言之冒泡排序法

今天的课后任务是2种排序方式&#xff08;冒泡排序和选择排序&#xff09; 冒泡排序法1 原理&#xff1a;从a[0]开始&#xff0c;依次将其和后面的元素比较&#xff0c;若a[0]>a[i]&#xff0c;则交换他们&#xff0c;一直比较到a[n]。同理对a[1], a[2], ……a[n-1]处理&a…

MySQL水平分区代理Spock Proxy(一)

为什么80%的码农都做不了架构师&#xff1f;>>> MySQL水平分区代理Spock Proxy 水平分区(sharding)将同一数据表中的数据通过特定的算法进行分离&#xff0c;分别保存在不同的数据表中&#xff0c;从而部署到不同的数据库服务器上。 水平分区后&#xff0c;数据拆分…