`
cryolite
  • 浏览: 580363 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hello OpenCL——向量相加(2)

阅读更多
NVIDIA安装后的OpenCL例子多是C++的,而且使用了CUDA提供的一些函数(通过包含oclUtils.h),OpenCL Programming Overview提供了2个例子,分别是向量相加、N体问题模拟。

前者是OpenCL最简单的例子:两个向量相加,但是文中的例子有几个小小的错误,可能会耽误初学者的时间,整理完整的代码如下:
#include <stdlib.h>
#include <stdio.h>
// 注意这里
#include <CL/cl.h>

#define LEN(arr) sizeof(arr) / sizeof(arr[0])
// 设备端kernel源程序,以字符串数组的方式保存,在某些论坛中提示每个语句最好以回车结束;
// 在运行时从源码编译成可执行在GPU上的kernel代码
const char* src[] = { 
    "__kernel void vec_add(__global const float *a, __global const float *b, __global float *c)\n",
    "{\n",
    "    int gid = get_global_id(0);\n",
    "    c[gid] = a[gid] + b[gid];\n",
    "}\n"
};

int main()
{
    // 创建OpenCL context,该context与GPU设备关联,详见OpenCL规范4.3节
    cl_context context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);

    // 获取context中的设备ID,详见OpenCL规范4.3节
    size_t cb;
    clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &cb);
    cl_device_id *devices = malloc(cb);
    clGetContextInfo(context, CL_CONTEXT_DEVICES, cb, devices, NULL);

    // create a command-queue,详见OpenCL规范5.1节
    cl_command_queue cmd_queue = clCreateCommandQueue(context, devices[0], 0, NULL);

    // 创建kernel,详见OpenCL规范5.4节和5.5.1节
    cl_program program = clCreateProgramWithSource(context, LEN(src), src, NULL, NULL);
    cl_int err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
    cl_kernel kernel = clCreateKernel(program, "vec_add", NULL);

    // Host端输入初始化
    size_t n = 5;
    float srcA[] = {1, 2, 3, 4, 5};
    float srcB[] = {5, 4, 3, 2, 1};
    float dst[n];

    // 设置kernel的输入输出参数,详见OpenCL规范5.2.1节
    cl_mem memobjs[3];
    memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * n, srcA, NULL);
    memobjs[1] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * n, srcB, NULL);
    memobjs[2] = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * n, NULL, NULL);
    // set "a", "b", "c" vector argument,详见OpenCL规范5.5.2节
    err  = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);
    err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);
    err |= clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&memobjs[2]);

    size_t global_work_size[1] = {n};
    // execute kernel,详见OpenCL规范6.1节
    err = clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, global_work_size, NULL, 0, NULL, NULL);

    // read output array,详见OpenCL规范5.2.2节
    err = clEnqueueReadBuffer(cmd_queue, memobjs[2], CL_TRUE, 0, n*sizeof(cl_float), dst, 0, NULL, NULL);

    for (int i=0; i<n; ++i) {
        printf("-> %.2f\n", dst[i]);
    }
    return 0;
}


编译:
gcc vec_add.c -lOpenCL -std=c99

参考:
  1. OpenCL Programming Overview
  2. OpenCL规范和API 1.0
分享到:
评论

相关推荐

    OpenCL实现向量加的简单例子

    ### OpenCL实现向量加法的简单实例解析 #### 一、OpenCL简介 OpenCL(Open Computing Language)是一种用于并行编程的标准框架,旨在为软件开发者提供一个开放的、免费使用的规范,来编写跨平台的高效并行计算程序...

    opencl向量加法

    2. 创建OpenCL上下文,它关联了主机和设备之间的通信。 3. 创建命令队列,用于调度和执行内核。 4. 编写内核源码字符串,创建程序对象。 5. 编译内核,生成可执行的内核二进制。 6. 创建输入和输出缓冲区,并将主机...

    OpenCL——AMD平台搭建

    AMD OpenCL 介绍在Windows系统下基于AMD GPU的OpenCL环境的搭建,并且基于矢量加法实例程序。 构建示例 在传统的AMD APP SDK设计中,已经不存在了,不知道为什么。但是AMD给了一种其他的方式, ...

    HelloOpenCL

    在本项目"HelloOpenCL"中,我们将学习如何使用OpenCL实现一个简单的功能:将输入的大写字母转换为小写字母,并进行输出。 首先,我们需要理解OpenCL的基本架构。OpenCL由三大部分组成:主机代码、设备端内核代码和...

    opencl_helloworld

    根据提供的文件信息,我们可以深入探讨OpenCL的基本概念与实践应用,特别是通过一个简单的Hello World示例来理解如何在OpenCL环境中编写和运行内核代码。 ### OpenCL简介 OpenCL(Open Computing Language)是一种...

    AM5728/AM57XX openCL使用案例二(计算向量和)

    下面通过一个向量相加的程序来了解OpenCL . 有A,B两个四维向量,相加后值存在C向量里,openCL根据用户提供的维数,将向量分解成多个任务分发给DSP进行并行计算。 openCL程序分为两个部份,一部份是内核代码,负责...

    RK3588 Android上应用使用OpenCL,所需的所有so

    主要是提供能在RK3588开发板上,应用开发能使用OPenCL来进行GPU加速所需的所有so

    IOS应用源码——利用OpenCL生成球体顶点 OpenCL_sphere.zip

    这个“IOS应用源码——利用OpenCL生成球体顶点 OpenCL_sphere.zip”压缩包包含了使用OpenCL来生成球体几何顶点的示例代码。下面我们将深入探讨OpenCL以及如何在iOS应用中利用它来生成球体顶点。 OpenCL是Khronos ...

    OpenCL编写的Hello程序,是个最小系统,可以入门

    OpenCL的“Hello World”程序,通常被称为“HelloCL”,是学习OpenCL编程的基础起点。这个程序包含了OpenCL的基本结构,包括初始化OpenCL环境、创建上下文、设备选择、队列创建、加载kernel源码、编译kernel、分配...

    opencl_414_2.zip

    在本项目"opencl_414_2.zip"中,我们主要探讨的是如何使用Qt框架结合OpenCL技术实现向量相乘的操作。Qt是一个跨平台的C++图形用户界面应用程序开发框架,而OpenCL则是一种开放标准,用于在各种硬件平台上进行并行...

    IOS应用源码——OpenCL_sphere.zip

    2. **iOS上的OpenCL集成**:在iOS应用中集成OpenCL,需要导入`&lt;OpenCL/OpenCL.h&gt;`头文件,并使用`cl::`命名空间。苹果提供了Metal Performance Shaders (MPS)来简化OpenCL的使用,但此源码可能直接使用了OpenCL API...

    Opencl_openclVs2015_OpencL_

    2. **VS2015集成OpenCL**:在Visual Studio 2015中,开发者可以通过安装特定的OpenCL SDK和工具来支持OpenCL开发。这些SDK通常包含库文件、头文件以及编译和调试工具。VS2015的集成环境可以方便地创建OpenCL项目,...

    papaa-opencl-master.zip

    《OpenCL技术详解——以papaa-opencl-master项目为例》 OpenCL,全称Open Computing Language,是一种开放源代码的并行计算框架,由Khronos Group组织维护,旨在提供一个跨平台、多设备的编程环境,尤其适用于GPU...

    OpenCL中文入门完整教程

    ### OpenCL中文入门完整教程知识点总结 #### 一、并行计算概述 ##### 1.1 并行计算概述 并行计算是指将一个复杂的计算任务分解为多个可同时处理的子任务,利用多处理器或多核心处理器等硬件资源来加速计算过程。...

    exm_opencl_hello_world_x64_linux.tar.gz_OpencL_column85w_linux_t

    《OpenCL Hello World on Linux for Intel FPGA》 在IT领域,OpenCL(Open Computing Language)是一种开放标准,用于实现跨平台的并行编程,尤其适用于高性能计算和嵌入式系统。OpenCL允许开发者利用CPU、GPU、...

    1 OpenCL vecadd.docx

    2. **创建上下文**:在OpenCL中,上下文(Context)是设备、队列和其他对象的容器。通过`clCreateContext`函数,我们可以创建一个与选定设备关联的上下文。 3. **创建命令队列**:命令队列(Command Queue)用于...

    opencl编程指南(中文版SDK)

    OpenCL领域公认的权威著作,由OpenCL核心设计人员亲自执笔,不仅全面而深刻地解读了OpenCL规范和编程模型,而且通过大量案例和代码演示了 基于OpenCL编写并行程序和实现各种并行算法的原理、方法、流程和最佳实 践,...

Global site tag (gtag.js) - Google Analytics