原文来自于:getting-started-with-opencl-and-gpu-computing/

对整个程序的注释:http://www.kimicat.com/opencl-1/opencl-jiao-xue-yi

但是对CUDA比较熟悉的用户来说,应该不需要看注释就能理解全部的程序

main.cpp

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <CL/cl.h>
  4. #define MAX_SOURCE_SIZE (0x100000)
  5. int main(void)
  6. {
  7. // Create the two input vectors
  8. int i;
  9. const int LIST_SIZE = ;
  10. int *A = (int*) malloc(sizeof(int) * LIST_SIZE);
  11. int *B = (int*) malloc(sizeof(int) * LIST_SIZE);
  12. for (i = ; i < LIST_SIZE; i++)
  13. {
  14. A[i] = i;
  15. B[i] = LIST_SIZE - i;
  16. }
  17.  
  18. // Load the kernel source code into the array source_str
  19. FILE *fp;
  20. char *source_str;
  21. size_t source_size;
  22. fp = fopen("vector_add_kernel.cl", "r");
  23.  
  24. if (!fp)
  25. {
  26. fprintf(stderr, "Failed to load kernel.\n");
  27. exit();
  28. }
  29. source_str = (char*) malloc(MAX_SOURCE_SIZE);
  30. source_size = fread(source_str, , MAX_SOURCE_SIZE, fp);
  31. fclose(fp);
  32.  
  33. // Get platform and device information
  34. cl_platform_id platform_id = NULL;
  35. cl_device_id device_id = NULL;
  36. cl_uint ret_num_devices;
  37. cl_uint ret_num_platforms;
  38. cl_int ret = clGetPlatformIDs(, &platform_id, &ret_num_platforms);
  39. ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, , &device_id,&ret_num_devices);
  40.  
  41. // Create an OpenCL context
  42. cl_context context = clCreateContext(NULL, , &device_id, NULL, NULL, &ret);
  43. // Create a command queue
  44. cl_command_queue command_queue = clCreateCommandQueue(context, device_id, , &ret);
  45.  
  46. // Create memory buffers on the device for each vector
  47. cl_mem a_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY,LIST_SIZE * sizeof(int), NULL, &ret);
  48. cl_mem b_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY,LIST_SIZE * sizeof(int), NULL, &ret);
  49. cl_mem c_mem_obj = clCreateBuffer(context, CL_MEM_WRITE_ONLY,LIST_SIZE * sizeof(int), NULL, &ret);
  50.  
  51. // Copy the lists A and B to their respective memory buffers
  52. ret = clEnqueueWriteBuffer(command_queue, a_mem_obj, CL_TRUE, ,LIST_SIZE * sizeof(int), A, , NULL, NULL);
  53. ret = clEnqueueWriteBuffer(command_queue, b_mem_obj, CL_TRUE, ,LIST_SIZE * sizeof(int), B, , NULL, NULL);
  54.  
  55. // Create a program from the kernel source
  56. cl_program program = clCreateProgramWithSource(context, ,(const char **) &source_str, (const size_t *) &source_size, &ret);
  57.  
  58. // Build the program
  59. ret = clBuildProgram(program, , &device_id, NULL, NULL, NULL);
  60. // Create the OpenCL kernel
  61. cl_kernel kernel = clCreateKernel(program, "vector_add", &ret);
  62. // Set the arguments of the kernel
  63. ret = clSetKernelArg(kernel, , sizeof(cl_mem), (void *) &a_mem_obj);
  64. ret = clSetKernelArg(kernel, , sizeof(cl_mem), (void *) &b_mem_obj);
  65. ret = clSetKernelArg(kernel, , sizeof(cl_mem), (void *) &c_mem_obj);
  66.  
  67. // Execute the OpenCL kernel on the list
  68. size_t global_item_size = LIST_SIZE; // Process the entire lists
  69. size_t local_item_size = ; // Process one item at a time
  70. ret = clEnqueueNDRangeKernel(command_queue, kernel, , NULL,&global_item_size, &local_item_size, , NULL, NULL);
  71.  
  72. // Read the memory buffer C on the device to the local variable C
  73. int *C = (int*) malloc(sizeof(int) * LIST_SIZE);
  74. ret = clEnqueueReadBuffer(command_queue, c_mem_obj, CL_TRUE, ,LIST_SIZE * sizeof(int), C, , NULL, NULL);
  75.  
  76. // Display the result to the screen
  77. for (i = ; i < LIST_SIZE; i++)
  78. printf("%d + %d = %d\n", A[i], B[i], C[i]);
  79.  
  80. // Clean up
  81. ret = clFlush(command_queue);
  82. ret = clFinish(command_queue);
  83. ret = clReleaseKernel(kernel);
  84. ret = clReleaseProgram(program);
  85. ret = clReleaseMemObject(a_mem_obj);
  86. ret = clReleaseMemObject(b_mem_obj);
  87. ret = clReleaseMemObject(c_mem_obj);
  88. ret = clReleaseCommandQueue(command_queue);
  89. ret = clReleaseContext(context);
  90.  
  91. free(A);
  92. free(B);
  93. free(C);
  94.  
  95. return ;
  96.  
  97. }

vector_add_kernel.cl

  1. __kernel void vector_add(__global const int *A, __global const int *B, __global int *C)
  2. {
  3. // Get the index of the current element to be processed
  4. int i = get_global_id();
  5. // Do the operation
  6. C[i] = A[i] + B[i];
  7. }

之前已经安装好了CUDA的运行环境,这里作者说使用g++ -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lOpenCL main.cpp -o openclApp命令来执行,结果提示

'clGetPlatformIDs' undefined reference,但是我的include和lib都是正常的,因此,调整编译命令为:

g++  main.cpp -o openclApp -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lOpenCL

编译通过并运行通过,因此gcc编译选项的顺序也对程序有一定影响(理论上不应该有这个问题)。但是,这个问题使用clang编译就没有任何影响。

OpenCl入门getting-started-with-opencl-and-gpu-computing的更多相关文章

  1. OpenCL入门:(二:用GPU计算两个数组和)

    本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl. ...

  2. OpenCL入门:(三:GPU内存结构和性能优化)

    如果我们需要优化kernel程序,我们必须知道一些GPU的底层知识,本文简单介绍一下GPU内存相关和线程调度知识,并且用一个小示例演示如何简单根据内存结构优化. 一.GPU总线寻址和合并内存访问 假设 ...

  3. OpenCL入门:(一:Intel核心显卡OpenCL环境搭建)

    组装的电脑没带独立显卡,用的是CPU自带的核显,型号是Intel HD Graphics 530,关于显卡是否可以使用OpenCL,可以下载GPU-Z软件查看. 本文在Windows 10 64位系统 ...

  4. OpenCL入门

    初入OpenCL,做个记录. 在Windows下开发OpenCL程序,必须先下载OpenCL的SDK,现在AMD,NVIDIA,Intel均提供各自的OpenCL库,基本是大同小异.安装好SDK后新建 ...

  5. OpenCl入门——实现简单卷积

    现在的卷积实现无非是那么几种:直接卷积.im2col+gemm.局部gemm.wingrod.FFT.如果直接卷积的话,其实kernel函数是比较好实现.以下代码参考至<OpenCL Progr ...

  6. 编译GDAL支持OpenCL使用GPU加速

    前言 GDAL库中提供的gdalwarp支持各种高性能的图像重采样算法,图像重采样算法广泛应用于图像校正,重投影,裁切,镶嵌等算法中,而且对于这些算法来说,计算坐标变换的运算量是相当少的,绝大部分运算 ...

  7. 安卓手机GPU OpenCL总结(转)

    前段时间,把市面上手机GPU OpenCL支持情况做了一个总结.总结如下: 目前,手机 GPU 市面有四个公司产品:Qualcomm, Imagination Technologies,ARM, Vi ...

  8. OpenCL与CUDA,CPU与GPU

    OpenCL OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计 ...

  9. 《OpenCL异构并行编程实战》补充笔记散点,第一至四章

    ▶ 总体印象:适合 OpenCL 入门的书,有丰富的代码和说明,例子较为简单.先把 OpenCL 代码的基本结构(平台 → 设备 → 上下文 → 命令队列 → 创建缓冲区 → 读写缓冲区 → 编译代码 ...

随机推荐

  1. kotlin 之相等判断

    在kotlin 中存在二种相等的判断: 1.引用相等 也就是说,两个引用指向同一个对象,使用===操作 ,相反操作为!==来判断 2.结构相等 使用equals 函数相等和==操作符 a?.equal ...

  2. 数据分析 - Excel 配色, 绘图, 技巧

    美学 配色 画图本身是美学的展示, 出色的配色是必须的 虽然本身美学并不是数据分析的必要, 但是也不能太low 如果做的太丑展示也是很尴尬 配色网站 点击这里 配置 现版本的 excel 中已存在较为 ...

  3. js常用正则(2)

    res(a, b, str) { //数字加英文 let re = `\^\\w{${a},${b}}\$` let reg = new RegExp(re); let status = !reg.t ...

  4. java+大文件分段上传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  5. cached占比过高

    Linux手动释放缓存的方法Linux释放内存的命令:syncecho 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义 ...

  6. 在 Laravel 中使用 MongoDB

     可参考:https://blog.csdn.net/weixin_38682852/article/details/80840678 环境准备 安装 MongoDB 安装 PHP-MongoDB 扩 ...

  7. Fabric 查看 blockfile_000000 区块文件

    进入peer docker exec -it peer bash cd /var/hyperledger/production/ledgersData/chains/chains

  8. idea查看源码没有注释的问题

    进入idea的设置 勾选这两个 然后重新导入 页面的右上角有个下载download source的提示,点击下载即可 然后页面就要源码注释了

  9. linux利用crontab添加定时任务详解

    crontab 作用:添加,查询,删除系统计划任务的指令. [root@localhost ~]# crontab [选项]选项:    -e:    编辑crontab定时任务    -l:    ...

  10. Kettle无法打开文件资源库

    问题: Kettle无法打开文件资源库. 问题描述: 新建文件资源库之后,资源库路径中有中文路径.退出kettle之后,再次进去发现没有了右上角的connect按钮了. 原因: kettle的repo ...