话说软件开发从来没有速成一说,一门语言你学的越快,说明你在别的语言上下个功夫越多,所以这次加了引号,只不过几周之后可能会有一个公司内部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. #define MEM_SIZE (128)
  5. #define MAX_SOURCE_SIZE (0x100000)
  6. int main()
  7. {
  8. cl_device_id device_id = NULL;
  9. cl_context context = NULL;
  10. cl_command_queue command_queue = NULL;
  11. cl_mem memobj = NULL;
  12. cl_program program = NULL;
  13. cl_kernel kernel = NULL;
  14. cl_platform_id platform_id = NULL;
  15. cl_uint ret_num_devices;
  16. cl_uint ret_num_platforms;
  17. cl_int ret;
  18. char string[MEM_SIZE];
  19. FILE *fp;
  20. char fileName[] = "./main.cl";
  21. char *source_str;
  22. size_t source_size;
  23. /* Load the source code containing the kernel*/
  24. fp = fopen(fileName, "r");
  25. if (!fp) {
  26. fprintf(stderr, "Failed to load kernel.\n");
  27. exit(1);
  28. }
  29. source_str = (char*)malloc(MAX_SOURCE_SIZE);
  30. source_size = fread(source_str, 1, MAX_SOURCE_SIZE, fp);
  31. fclose(fp);
  32. /* Get Platform and Device Info */
  33. ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
  34. ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices);
  35. /* Create OpenCL context */
  36. context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
  37. /* Create Command Queue */
  38. command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
  39. /* Create Memory Buffer */
  40. memobj = clCreateBuffer(context, CL_MEM_READ_WRITE,MEM_SIZE * sizeof(char), NULL, &ret);
  41. /* Create Kernel Program from the source */
  42. program = clCreateProgramWithSource(context, 1, (const char **)&source_str,(const size_t *)&source_size, &ret);
  43. /* Build Kernel Program */
  44. ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
  45. /* Create OpenCL Kernel */
  46. kernel = clCreateKernel(program, "hello", &ret);
  47. /* Set OpenCL Kernel Parameters */
  48. ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobj);
  49. /* Execute OpenCL Kernel */
  50. ret = clEnqueueTask(command_queue, kernel, 0, NULL,NULL);
  51. /* Copy results from the memory buffer */
  52. ret = clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0,
  53. MEM_SIZE * sizeof(char),string, 0, NULL, NULL);
  54. /* Display Result */
  55. puts(string);
  56. /* Finalization */
  57. ret = clFlush(command_queue);
  58. ret = clFinish(command_queue);
  59. ret = clReleaseKernel(kernel);
  60. ret = clReleaseProgram(program);
  61. ret = clReleaseMemObject(memobj);
  62. ret = clReleaseCommandQueue(command_queue);
  63. ret = clReleaseContext(context);
  64. free(source_str);
  65. getchar();
  66. return 0;
  67. }

新建文件,后缀改成.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的含义,写上中文注释(最好别直接翻译),将代码上传到自己的版本管理工具上。

OpenCL “速成”冲刺【第一天】相关推荐

  1. 信息系统项目管理师考前冲刺第一天:项目基础知识和立项管理

    摘要:信息系统项目管理师考前冲刺共十节视频,本文针对第一天冲刺讲解,内容为:项目基础知识和立项管理. 本冲刺针对十大管理进行重点.考点回顾,听课时,注意薄弱环节,重点复习.本视频由科科过<每天一 ...

  2. 团队第二次冲刺第一天

    今天是第二次冲刺第一天. 今天主要是查询相关知识和书籍 明天打算继续学习 遇到的困难有:不知道该如何下手 转载于:https://www.cnblogs.com/yyting/p/5521394.ht ...

  3. Bata冲刺 第一天

    一.冲刺第一天完成任务情况及贡献小时数: 姓名 今日已完成任务 时间(h) 马仲山 代码调整 2 马婧(12) 整理需求文档 2 马婧(13) 整理设计文档 2 马世芳 编写测试文档 2 张俊逸   ...

  4. spring冲刺第一天

    第一天总结 昨天我们开始了spring冲刺会议,我们进行了明确的分工,每个人都有自己的任务.我的目前任务是游戏地图的初步设计. 今天早上我们开了站立会议,算是正式开始了spring冲刺.我上网查找了一 ...

  5. 第二阶段团队项目冲刺第一天

    经过第一阶段的冲刺,我们网站的雏形已经具备,通过第一阶段的演示评估,我们针对各组给出的建议进行了优化,对各个模块的分化和其功能有了更加清楚的认识.这对我们展开第二阶段的工作有着巨大的帮助. 今天的个人 ...

  6. Beta阶段冲刺第一天

    提供当天站立式会议照片一张 讨论项目每个成员的昨天进展 昨天开始了Beta阶段的冲刺,总体讨论了一下这个阶段的任务,然后明确了个人分工. 讨论项目每个成员的存在问题 第一天暂时还没有什么问题,可能最大 ...

  7. 《AlwaysRun!》第八次团队作业:Alpha冲刺 第一天

    项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 Always Run! 作业学习目标 (1)掌握软件测试基础技术 (2)学习 ...

  8. 第二阶段冲刺—第一天

    一.计划会议内容 在第一阶段留下来的基础上,首先解决的是网页前端设计问题 二.任务看板 进行中:前端网页优化设计 待进行:资料下载,新闻实时更新,视频播放在线学习功能,小bug的测试与完善 三.scr ...

  9. Beta冲刺 第一天

    1.各个成员今日完成的任务及对项目的贡献小时数 姓名 今日已完成任务 时间 马玉婷 用户界面的完善 3h 马美玲 数据库的完善 3h 以西卓嘎 完善需求文档及撰写博文 3h 2.各个成员明日的任务安排 ...

最新文章

  1. Networkx-cycle
  2. RegisterStartupScript 和 RegisterClientScriptBlock 的区别
  3. bzoj1875 边点互换+矩乘
  4. 2.2.2 指数加权平均
  5. ffmpeg 把视频解码成jpg
  6. jQuery的DOM操作之取值/赋值(1)
  7. insert into select 主键自增_springboot2结合mybatis拦截器实现主键自动生成
  8. transform你不知道的那些事
  9. 4个优化MongoDB的技巧
  10. 将枚举的键值绑定到下拉列表框
  11. 自己组装服务器计算机,深度学习服务器组装经验过程分享
  12. Log4j 与 Logback的ConversionPattern对比
  13. 一张以你为中心的地图
  14. Python+OpenCV:图像平滑
  15. java mime上传_JavaWeb中实现文件上传的方式有哪些?
  16. Sencha touch 开发系列:容器组件:tabpanel,carousels
  17. android设备连接打印机,【Android快讯】教你通过Android设备直接连接打印机打印文件...
  18. 【数据结构与算法-动态规划系列经典例题汇总】
  19. Windows10系统自带输入法如何切换全角/半角字符
  20. 学生托管班_小学生托管班托管班价格是多少?如何收费?

热门文章

  1. 一步步编写操作系统 2 部署工作环境 2
  2. python表格处理免费教程_手把手教你用Python处理Excel表格
  3. 记录一次HBase的scan的分页查询
  4. Angular使用Console.log()打印出来的数据没问题,点击详情后数据变了
  5. PWN-PRACTICE-BUUCTF-10
  6. 【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)
  7. 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)
  8. oracle排名怎么去除空值影响,Oracle排序中null值处理方法讲解
  9. linux虚拟机上安装域名,虚拟机如何安装linux系统
  10. Linux生态ox版本,从折腾说Linux生态圈