OpenCl菜鸟,初学笔记1---opencl工作原理

OpenCL 的架构

OpenCL 包括一组 API 和一个程式语言。基本上,程式透过 OpenCL API 取得 OpenCL 装置(例如显示晶片)的相关资料,并将要在装置上执行的程式(使用 OpenCL 程式语言撰写)编译成适合的格式,在装置上执行。OpenCL API 也提供许多装置控制方面的动作,例如在 OpenCL 装置上取得一块记忆体、把资料从主记忆体复制到 OpenCL 装置上(或从 OpenCL 装置上复制到主记忆体中)、取得装置动作的资讯(例如上一个程式执行所花费的时间)等等。

例如,我们先考虑一个简单的工作:把一群数字相加。在一般的 C 程式中,可能是如下:

float a[DATA_SIZE];

float b[DATA_SIZE];

float result[DATA_SIZE];

// ...

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

result[i] = a[i] + b[i];

}

在 OpenCL 中,则大致的流程是:

  1. 把 OpenCL 装置初始化。
  2. 在 OpenCL 装置上配置三块记忆体,以存放 a、b、c 三个阵列的资料。
  3. 把 a 阵列和 b 阵列的內容,复制到 OpenCL 装置上。
  4. 编译要执行的 OpenCL 程式(称为 kernel)。
  5. 执行编译好的 kernel。
  6. 把计算結果从 OpenCL 装置上,复制到 result 阵列中。

透过 data parallel 的模式,这里的 OpenCL 程式非常简单,如下所示:

__kernel void adder(__global const float* a, __global const float* b, __global float* result)

{

int idx = get_global_id(0);

result[idx] = a[idx] + b[idx];

}

在一般的版本中,是透过一个回圈,执行 DATA_SIZE 次数的加法动作。而在 OpenCL 中,则是建立DATA_SIZE 个 work item,每个 work item 都执行上面所示的 kernel。可以看到,OpenCL 程式语言和一般的 C 语言非常类似__kernel表示这个函式是在 OpenCL 装置上执行的

       __global则表示这个指标是在 global memory 中(即 OpenCL 装置上的主要記记忆体)。而 get_global_id(0) 会传回 work item 的编号,例如,如果有 1024 个 work item,则编号会分別是 0 ~ 1023(实际上编号可以是二维或三维,但在这里先只考虑一维的情形)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值