文章关键字 ‘Tutorial’

OpenCL系列(四)-Memory

2009年11月28日,星期六

Memory分类和访问(Memory Layout and Access)

opencl将存储模型分为三种:Private Memory,Local Memory,Constant Memory和Global Memory。其中Private Memory只可以被work-item使用,也就是单个work-item私有的;Local Memory可以被同一个work-group内的work-item所使用;Global Memory可以被所有的work-item访问和修改;而Constant Memory是Global Memory的一种,区别在于它是不能被更改的。示意图如下[1]:
opencl_memory_layout

大致了解了opencl中存储类型后,就会发现opencl的memory model和cuda的极为类似,ok,这里就简单的列出opencl中集中memory类型在Nvidia的GPU、AMD的GPU和CPU中实际对应的数据类型:

Opencl Nvidia CUDA ATI GPU AMD CPU
Global Memory Global Memory global buffer (g[] in CAL/IL) 系统内存(RAM)
Local Memory Shared Memory Local Data Share CPU L1缓存
Private Memory Register scratch memory (x[] in CAL/IL) 系统内存RAM

update@2009.11.30
Opencl中还有一种存储类型:Image,也就是cuda中的纹理内存,包含2D和3D image。与CUDA中纹理一样提供不同的插值(采样)方式,同时也提供一定cache(硬件支持的),个人感觉,这是一个GPU的遗留产物,在CPU和DSP等的Opencl实现极有可能不提供对其的支持。所以要注意在使用时,最好先查询一下是否支持。

如何使用(How to use these memory)
to be continued…

OpenCL系列讲座(三) Step By Step

2009年11月8日,星期日

  我们已经写好的Kernel函数一般保存在一个字符串内,例如在第二节中的kernel:输入两个一维数组,用另外一个一维数组输出两个一维数组求和的结果,如下:

char* chKernelSource = "__kernel sum 
(__global const float* a, __global const float* b,  
__global float* answer)
{
   int xid = get_global_id(0);
    answer[xid] = a[xid] + b[xid];
}";

概述中所言,下面我们一步一步来写Host代码Main函数部分;
  (全文…)

OpenCL系列讲座(二) 基本概念

2009年11月7日,星期六

1、计算设备(Compute Device). 是指系统中支持OpenCL的各类处理器,可以是CPU, GPU,甚至是DSP。一个系统中可以有多个Device连接到主机(Host)上。另外,每个device中会包含多个计算单元(Compute Unit),例如多核的CPU或者GPU中的多处理器(Multi-Processor). 而每个计算单元中还可以包含多个处理单位(PE, Processing Element). CPU中每个计算单元只含有一个PE, 而GPU中则含有多个。我们可以通过clGetDeviceIDs()这个函数来检查系统中是否有支持OpenCL的设备,并且配合clGetDeviceInfo()函数来了解该设备中如设备类型、计算单元个数等信息。

image

2、执行(Execution)
最终在Device上执行的代码成为内核(Kernel),这类代码是C语言的扩展,像下面这样子:

__kernel sum(__global const float* a, __global const float* b,
    __global float* answer)
{
   int xid = get_global_id(0);
    answer[xid] = a[xid] + b[xid];
}

(全文…)

OpenCL系列讲座(一) 概览

2009年11月4日,星期三

OpenCL(Open Computing Language)是由Apple发起,由Khronos负责起草的用于跨平台并行计算的工业标准。基于该标准,我们可以使用任何系统中支持该标准的计算资源。由于该标准支持不同的编程语言、不同的硬件设备并且高效,因此可能成为软件、中间件乃至使用高性能计算设备厂商的有效解决方案。
(全文…)