OpenCL编程指南-4.1OpenCL C编程

使用OpenCL C编写数据并行内核

OpenCL中的数据并行性表述为一个N维计算域,其中N=1、2或3。N-D域定义了可以并行执行的工作项的总数。下面通过一个简单的例子来了解如何用OpenCL C编写一个数据并行内核,将两个浮点数数组相加。这个代码的串行版本求和时需要通过一个for循环将两个数组中的各个元素相加:

void scalar_add (int n, const float *a, const float *b, float *result)
{
      int i;
      for (i = 0; i < n; i++)
      {
           result[i] = a[i] + b[i];
      }
}

使用OpenCL C的数据并行代码如下所示。

kernel void scalar_add(global const float *a, global const float *b, global float *result)
{
      int id = get_global_id(0);
      result[id] = a[id] + b[id];
}

scalar_add函数声明使用kernel限定符指示这是一个OpenCL C内核。需要说明的是,scalar_add内核只包括计算单个元素求和的代码,也就是内循环。N-D域是设置为n的1维域。对于n个工作项,要为每个工作项分别执行内核来生成数组a和b的和。为此,每个要执行内核的工作项需要知道要对数组a和 b中的哪个元素求和。对于各个工作项来说,这必须是唯一的值,要由N-D域(将内核入队等待执行时指定)得出。get_global_id(0)返回各个工作项的1维全局ID。

图4-1显示了如何使用get_global_id唯一标识执行内核的工作项列表中的一个工作项。
在这里插入图片描述
OpenCL C编程语言用来创建描述数据并行内核和任务的程序,这些内核和任务可以在一个或多个异构设备上执行,如 CPU、GPU和另外一些称为加速器的处理器(如DSP和 Cell Broad-band Engine (B.E.)处理器)。OpenCL程序类似于一个动态库,OpenCL 内核则类似于动态库的一个导出函数。应用程序可以直接从代码调用由动态库导出的函数。不过,应用程序不能直接调用OpenCL内核,只能将内核的执行放在一个为设备创建的命令队列中排队。内核与宿主机CPU上运行的应用代码异步执行。

OpenCL C基于ISO/IEC 9899:1999 C语言规范(简称为C99),并针对并行性对语言做了一些限制和特定扩展。

OpenCL C还为C99增加了以下特性:
1)矢量数据类型 很多OpenCL设备(如Intel SSE、面向POWER和Cell的AltiVec,以及ARM NEON)都支持矢量指令集。这个矢量指令集在C/C++代码中通过内置函数访问(其中一些可能特定于设备),或者利用设备特定的汇编指令访问。类似于C语言中使用标量类型,在OpenCL C中可以采用同样的方式使用矢量数据类型。基于这一点,开发人员可以更容易地编写矢量代码,因为可以对矢量和标量数据类型使用类似的操作符。这样还便于编写可移植的矢量代码,因为现在的OpenCL编译器会负责将OpenCL C中的矢量操作映射到设备上适当的矢量ISA。基于常规的内存访问以及更好地结合这些内存访问,矢量代码还有助于提高内存带宽。
2)地址空间限定符 诸如GPU等OpenCL设备实现了一个内存层次结构。地址空间限定符用来标识这个层次结构中的一个特定内存区域。
3)对语言的并行性补充 这包括对工作项和工作组的支持,还包括对工作组中工作项之间的同步提供支持。
4)图像 OpenCLC增加了图像和采样器数据类型,还增加了读、写图像的内置函数。
5)庞大的内置函数集合 如数学函数、整数函数、几何函数和关系函数。

标量数据类型

OpenCL C支持的C99标量数据类型如下1。与C不同,OpenCL C指定了整数和浮点数据类型的大小,也就是具体的位数。

bool                       这是一个条件数据类型,可以为truefalsetrue可以扩展为整数常量1,值false扩展为整数常量0

char                       有符号8位整数,2的补值
unsigned char uchar        无符号8位整数
short                      有符号16位整数,2的补值
unsigned short ushort      无符号16位整数
int                        有符号32位整数,2的补值
unsigned int uint          无符号32位整数
long                       有符号64位整数,2的补值
unsigned long ulong        无符号64位整数

float                      32位浮点数
                           float数据类型必须符合IEEE 754单精度存储格式

double                     64位浮点数
                           double 数据类型必须符合IEEE 754双精度存储格式
                           这是一个可选的格式,只有当设备支持双精度扩展(cl_khr_fp64)时才可用

half                       16位浮点数
                           half数据类型必须符合IEEE 754-2008半精度存储格式

size_t                     无符号整数类型,这是 sizeof操作符结果的类型
                           如果设备的地址空间为32位,这就是一个32位无符号整数;
                           如果设备的地址空间是64位,这就是个64位无符号整数

ptrdiff_t                  有符号整数类型,这是两个指针相减结果的类型
                           如果设备的地址空间为32位,这就是一个32位有符号整数;
                           如果设备的地址空间是64位,这就是一个64位有符号整数

intptr_t                   有符号整数类型,它有一个性质,任何指向void的合法指针都可以转换为这个类型,
                           然后还可以再转换回指向void的指针,其结果与原指针比较是相等的


uintptr_t                  无符号整数类型,它有一个性质,任何指向void 的合法指针都可以转换为这个类型,
                           然后还可以再转换回指向void的指针,其结果与原指针比较是相等的

void                       void类型构成值的一个空集
                           这是一个不完整的类型,而且不能补全
                           

half数据类型

half数据类型必须符合IEEE 754—2008。Half数有一个符号位、5个指数位和10个尾数位。符号、指数和尾数的解释与IEEE754浮点数的相应解释类似。指数偏差为15。half数据类型必须能表示有限标准数、非规格化数、无穷大和NaN(非数字)。half数据类型的非规格化数可能在使用内置函数vstore_half将一个float转换为half时生成,也可能在使用内置函数vload_half将一个half转换为float时生成,这些非规格化数不能刷新为0。

float转换为half时会适当地将尾数舍入为11位精度。Halffloat的转换则是无损的,所有half数都可以准确地表示为float值。

half数据类型只能用来声明指针指向一个包含half值的缓冲区。下面给出几个合法使用half数据类型的例子:

void bar(global half *p)
{
     ....
}

void foo(global half *pg, local half *pl)
{
     global half *ptr;
     int offset;
 
     ptr = pg + offset;
     bar(ptr);
}

下面是一个非法使用half类型的例子:

half a;
half a[100];

half *p;
a = *p; //not allowed. must use vload_half function

可以使用vload_halfvload_halfnvloada_halfn 以及 vstore_halfvstore_halfnvstorea_halfn函数分别完成对half指针的加载和存储。加载(load)函数从内存读取标量或矢量half值,将其转换为一个标量或矢量浮点值。存储(store)函数将一个标量或矢量浮点值作为输入,将它转换为一个half标量或矢量值(采用适当的舍入模式),并把这个half标量或矢量值写入内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣19删除链表的倒数第 N 个结点:思路分析+图文全解+方法总结(快慢指针法递归法)+深入思考

文章目录 第一部分&#xff1a;题目描述第二部分&#xff1a;代码实现2.1 快慢指针法2.2 递归 第一部分&#xff1a;题目描述 &#x1f3e0; 链接&#xff1a;19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; ⭐ 难度&#xff1a;中等 第二部分&#…

lol由于找不到vcruntine140_1.dll文件,vcruntime140_1.dll修复方法

家人们有没有遇到过打开游戏或者软件提示由于找不到vcruntime140_1.dll&#xff0c;无法继续执行此代码的情况&#xff0c;是不是不知道怎么修复呢&#xff1f;Vcruntime140_1.dll是一个Windows系统文件&#xff0c;它是Microsoft Visual C Redistributable for Visual Studio …

【嵌入式环境下linux内核及驱动学习笔记-(11-设备树)】

目录 1、设备树体系1.1 DTS /DTSI / DTC / DTB 2、基础语法2.1 节点语法2.1.1 通用名称建议 2.2 属性语法2.2.1 属性值 2.3 关于label2.4 节点的[unit-address] 与reg属性2.5 根节点 /2.6 标准属性compatible2.6.1 of_machine_is_compatible函数 2.7 地址编码2.7.1 标准属性#ad…

RabbitMQ养成记 (3.MQ的简单工作模式 和 Pub/sub 订阅模式)

上一篇是一个简单的helloworld。 我们直接发直接收 这种是最简单的。 下面我们再来接触更加复杂一点&#xff1a; 简单工作模式 work queues 工作队列模式&#xff1a; 这里注意 这里的消息 对两个消费者 c1 c2来说是竞争关系 而不是等份分发关系&#xff0c; 就像两个线程…

JVM 方法区

栈、堆、方法区的交互关系 线程共享角度: 新建对象分配: 方法区的理解 方法区(Method Area) 与 Java 堆一样&#xff0c;是各个线程共享的内存区域方法区在 JVM 启动的时候被创建&#xff0c;并且它的实际物理内存空间中和 Java 堆区一样都可以不连续的方法区的大小&#xf…

HNU-操作系统OS-实验Lab5

OS_Lab5_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf &#xff08;学号 202108010XXX&#xff09; 实验目的 了解第一个用户进程创建过程了解系统调用框架的实现机制了解ucore如何实现系统调用sys_fork/sys_exec/sys_exit/sys_wait来进行进程管理 实验…

1099 Build A Binary Search Tree(超详细注解+38行代码)

分数 30 全屏浏览题目 作者 CHEN, Yue 单位 浙江大学 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree…

使用云服务器可以做什么?十大使用场景举例说明

使用阿里云服务器可以做什么&#xff1f;阿里云百科分享使用阿里云服务器常用的十大使用场景&#xff0c;说是十大场景实际上用途有很多&#xff0c;阿里云百科分享常见的云服务器使用场景&#xff0c;如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程…

详解c++STL—string组件

目录 一、string基本概念 1、本质 2、string和char * 区别&#xff1a; 3、特点&#xff1a; 二、string构造函数 1、构造函数原型 2、示例 三、string赋值操作 1、赋值的函数原型 2、示例 四、string字符串拼接 1、函数原型 2、示例 五、string查找和替换 1、功…

2023系统分析师---软件工程、系统规划高频错题

系统规划---成本效益分析 评价信息系统经济效益常用的方法主要有成本效益分析法,投入产出分析法和价值工程方法。盈亏平衡法常用于销售定价; 可行性分析 系统规划是信息系统生命周期的第一个阶段,其任务是对企业的环境、目标以及现有系统的状况进行初步调查,根据企业目标…

【利用AI让知识体系化】万字深入浅出Nginx

思维导图 文章目录 思维导图 第一部分&#xff1a;入门篇1.1 起步下载和安装Nginx启动NginxNginx配置文件Nginx命令行总结 1.2 Nginx的基本架构1.3 安装和配置Nginx1.4 Nginx的基本操作 第二部分&#xff1a;核心篇2.1 Nginx的请求处理2.2 Nginx的缓存机制2.3 Nginx的负载均衡机…

题解校验码—CRC循环校验码与海明校验码

码距 一个编码系统的码距是任意两个码字的最小距离。 例如个编码系统采用三位长度的二进制编码&#xff0c;若该系统有四种编码分别为&#xff1a;000&#xff0c;011&#xff0c;100&#xff0c;111&#xff0c;此编码系统中000与111的码距为3&#xff1b;011与000的码距为2…

Hard Patches Mining for Masked Image Modeling

摘要 蒙面图像建模&#xff08;MIM&#xff09;因其在学习可伸缩视觉表示方面的潜力而引起了广泛的研究关注。在典型的方法中&#xff0c;模型通常侧重于预测掩码补丁的特定内容&#xff0c;并且它们的性能与预定义的掩码策略高度相关。直观地说&#xff0c;这个过程可以被看作…

WiFi(Wireless Fidelity)基础(九)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

【GAMES101】作业2学习总结

本系列博客为记录笔者在学习GAMES101课程时遇到的问题与思考。 GAMES101&#xff1a;课程官网GAMES101&#xff1a;B站视频GAMES101&#xff1a;相关文件下载(百度网盘) 一、基础题 本次作业的目的是为了让我们熟悉三角形栅格化的相关操作&#xff0c;通过Assignment2.pdf可以…

白嫖chatgpt的Edge插件,很难不爱啊

目录 &#x1f341;1.常见的Edge浏览器界面 &#x1f341;二.安装WebTab插件 &#x1f341;三.WebTab插件的各种功能 &#x1f341;1.支持免费的chatgpt&#xff0c;不限次数​编辑 &#x1f341;2.有几个休闲的小游戏可以玩耍&#xff0c;点击即玩。 &#x1f341;3.支…

618前夕,淘宝天猫大变革,探索电商天花板之上的价值

2023年淘宝天猫618商家大会&#xff0c;恰逢淘宝20周年&#xff0c;也是阿里“16N”组织架构改革&#xff0c;淘宝天猫“独立”经营后&#xff0c;管理和运营团队的首次亮相。除了淘宝天猫618的具体策略&#xff0c;最受关注的&#xff0c;还有淘宝天猫的大变革——涉及淘宝天猫…

AD9680+JESD204B接口+FPGA FMC高速率数据采集板卡

板卡概述&#xff1a; 【FMC_XM155】 FMC_XM155 是一款基于 VITA57.1 标准的&#xff0c;实现 2 路 14-bit、500MSPS/1GSPS/1.25GSPS 直流耦合 ADC 同步采集 FMC 子卡模 块。 该模块遵循 VITA57.1 规范&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板 卡 ADC 器件采用…

CN学术期刊《西部素质教育》简介及投稿邮箱

《西部素质教育》&#xff08;半月刊&#xff09;创刊于2015年&#xff0c;是由青海人民出版社有限责任公司主管/主办的教育类学术期刊&#xff0c;本刊恪守“追踪教育研究前沿&#xff0c;关注教育实践热点&#xff0c;探索创新教育理念&#xff0c;传播教育教学信息&#xff…

Linux相关问题

中英文切换 super空格切换中英文&#xff1b;super指键盘上的Win键&#xff1b; 开机自启动服务设置 可视化方式&#xff1a;输入setup命令进入自启动服务配置&#xff1b;通过上下键选中服务&#xff0c;通过空格选择是否自启动该服务&#xff1b; 开启不同的终端 CTRLALT…