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

原创 2016年05月30日 13:40:41

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

 

openCL程序分为两个部份,一部份是内核代码,负责具体算法。另一部份是主程序负责初始化OpenCL和准备数据。主程序加载内核代码,并按照既定方法进行运算

 

kernel代码如下

__kernel voidvectoradd(__global int *a, __global int *b, __global int *c)

{

    int id = get_global_id(0);

    c[id] = a[id] + b[id];

}

 __kernel 指明这是一个openCL内核,__global 说明指针指向的是全局的设备内存空间

 

HOST端代码如下

int get_ocl_string(const char *file_name, char *ocl_string)

{

    FILE *fp;

    int file_length;

    int status = 0;

   

    fp = fopen(file_name, "r");

    if (fp == NULL)

        return -1;

   

    fseek(fp, 0, SEEK_END);

    file_length = ftell(fp);

    fseek(fp, 0, SEEK_SET);

    status = fread(ocl_string, 1, file_length,fp);

    if (status == -1)

        return -1;

    return file_length;

}

 

int main(void)

{

    int array_a[10] = {0, 1, 2, 3, 4, 5, 6, 7,8, 9};

    int array_b[10] = {9, 8, 7, 6, 5, 4, 3, 2,1, 0};

    int array_c[10] = {0, 0, 0, 0, 0, 0, 0, 0,0, 0};

    size_t datasize = 10 * sizeof(int);

    size_t ocl_string_size;

    char *ocl_string;

 

    ocl_string = (char *)malloc(1024*1024);

    cl_platform_id platform_id;

    cl_device_id device_id;

    cl_context context;

    cl_command_queue command_queue;

    cl_mem buffer_a, buffer_b, buffer_c;

    cl_program program;

    cl_kernel kernel;

   

    clGetPlatformIDs(1, &platform_id,NULL);

    clGetDeviceIDs(platform_id,CL_DEVICE_TYPE_ACCELERATOR, 1, &device_id, NULL);

   

    //创建上下文

    context = clCreateContext(NULL, 1,&device_id, NULL, NULL, NULL);

    command_queue = clCreateCommandQueue(context,device_id, 0, NULL);

   

   //分配内存

    buffer_a = clCreateBuffer(context,CL_MEM_READ_ONLY, datasize, NULL, NULL);

    buffer_b = clCreateBuffer(context,CL_MEM_READ_ONLY, datasize, NULL, NULL);

    buffer_c = clCreateBuffer(context,CL_MEM_READ_ONLY, datasize, NULL, NULL);

   

   //读取核函数,并且上传到DSP端

    ocl_string_size =get_ocl_string("vectoradd.cl", ocl_string);

    clEnqueueWriteBuffer(command_queue,buffer_a, CL_FALSE, 0, datasize, array_a, 0, NULL, NULL);

    clEnqueueWriteBuffer(command_queue,buffer_b, CL_FALSE, 0, datasize, array_b, 0, NULL, NULL);

    program =clCreateProgramWithSource(context, 1, (const char **)&ocl_string,&ocl_string_size, NULL);

    clBuildProgram(program, 1, &device_id,NULL, NULL, NULL);

    kernel = clCreateKernel(program,"vectoradd", NULL);

 

   //传递参数

    clSetKernelArg(kernel, 0,sizeof(cl_mem),&buffer_a);

    clSetKernelArg(kernel, 1,sizeof(cl_mem),&buffer_b);

    clSetKernelArg(kernel, 2,sizeof(cl_mem),&buffer_c);

 

    size_t global_work_size[1] = {10};

    //执行核函数

    clEnqueueNDRangeKernel(command_queue,kernel, 1, NULL, global_work_size, NULL, 0, NULL, NULL);

    //从核函数取回计算结果

    clEnqueueReadBuffer(command_queue,buffer_c, CL_TRUE, 0, datasize, array_c, 0, NULL, NULL);

    for (int i = 0 ; i < 10; i ++) {

        printf("%d ", array_a[i]);

    }

    printf("\n");

    for (int i = 0 ; i < 10; i ++) {

        printf("%d ", array_b[i]);

    }

    printf("\n");

    for (int i = 0 ; i < 10; i ++) {

        printf("%d ", array_c[i]);

    }

    printf("\n");

    clReleaseKernel(kernel);

    clReleaseProgram(program);

    clReleaseCommandQueue(command_queue);

    clReleaseMemObject(buffer_a);

    clReleaseMemObject(buffer_b);

    clReleaseMemObject(buffer_c);

    clReleaseContext(context);

    return 0;

}

将上述程序编译,结果如下

0 1 2 3 4 5 6 7 89

9 8 7 6 5 4 3 2 10

9 9 9 9 9 9 9 9 99


转载,请注明  匠牛社区AM5728开发板



版权声明:本文为博主原创文章,未经博主允许不得转载。

AM5728/AM57XX openCV使用opencl案例二(Canny算法)

OpenCV介绍: OpenCV(Open Source Computer Vision Library)是一个基于BSD许可开源发行的跨平台计算机视觉库。实现图像处理和计算机视觉方面的很多通用计算。...
  • ohyes158
  • ohyes158
  • 2016年06月20日 09:44
  • 1240

AM5728/AM57XX openCL使用案例三(矩阵转置)

下面对10x10矩阵进行转置,调用openCL,10X10矩阵采用二维数组进行存储,在程序设计上,让转置过程分10次转置完成,就是一次转一行,因此OpenCL的工作维数是二维   openCL程序分为...
  • ohyes158
  • ohyes158
  • 2016年06月19日 21:56
  • 936

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

下面通过一个向量相加的程序来了解OpenCL . 有A,B两个四维向量,相加后值存在C向量里,openCL根据用户提供的维数,将向量分解成多个任务分发给DSP进行并行计算   openCL程序分为两个...
  • ohyes158
  • ohyes158
  • 2016年05月30日 13:40
  • 1319

Linux内核驱动之视频基础(一)色彩空间

一 概述 RGB和YUV(也称YCbCr)都是色彩空间,用于表示颜色,两者可以相互转化.   RGB(红绿蓝)是从颜色发光的原理来设计的,可表示大部分颜色。 但在科学研究上一般不采用RGB颜色...
  • ohyes158
  • ohyes158
  • 2016年07月07日 22:52
  • 458

OpenCL向量加法

简介 下面一个例子介绍了向量加法的OpenCL版,相当于学习C语言中的“Hello World”,本篇教程中的代码以及其余相关教程都可以通过OLCF github下载 vecAdd.c #in...
  • lwfcgz
  • lwfcgz
  • 2015年03月04日 12:02
  • 2414

OpenCL异构计算 - 向量相加

// vecadd.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h"#include #include #include const char* program...
  • u012678352
  • u012678352
  • 2017年02月07日 15:42
  • 280

OpenCL 第5课:向量相加

OpenCL程序分为两个部份,一部份是内核代码,负责具体算法。另一部份是主程序负责初始化OpenCL和准备数据。主程序加载内核代码,并按照即定方法进行运算。 内核代码可以写在主程序里面,也可以写在另...
  • szu030606
  • szu030606
  • 2014年04月21日 14:35
  • 1021

OpenCL之简单的向量加法实现

opencl并行计算入门程序,详细介绍每一个步骤而且有代码解释,非常基本的教程。一起来学习opencl吧!...
  • c602273091
  • c602273091
  • 2015年05月01日 08:25
  • 2255

AM5728/AM57XX openCV使用opencl案例一(Sobel算法)

OpenCV介绍: OpenCV(Open Source Computer Vision Library)是一个基于BSD许可开源发行的跨平台计算机视觉库。实现图像处理和计算机视觉方面的很多通用计算。...
  • ohyes158
  • ohyes158
  • 2016年06月19日 22:17
  • 1579

AM5728/AM57XX系列芯片介绍

AM57XX系列芯片是TI  Sitara Processors里最新款芯片 集成了TI最新的技术和工艺   AM57XX系列芯片包括AM5728,AM5726,AM5718,AM5718 他们主要区...
  • ohyes158
  • ohyes158
  • 2016年05月25日 22:48
  • 2484
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AM5728/AM57XX openCL使用案例二(计算向量和)
举报原因:
原因补充:

(最多只允许输入30个字)