OpenCL编程指南-3.3类型转换

news2024/11/23 22:35:39

隐式类型转换

隐式类型转换是一种自动的类型转换,只要混合使用不同的类型,编译器就会完成这种隐式类型转换。这里支持表4-1中定义的标量类型(除voiddoublehalf以外)的隐式转换。完成隐式转换时,并不只是重新解释一个表达式的值,而是将这个值转换为新类型的一个等价的值。

考虑下面的例子:

float f = 3; //implicit conversion to float value 3.0
int i = 5.23f; //implicit conversion to float value 5

在这个例子中,值3转换为float3.0f,然后赋予f。值5.23f转换为一个int值5,然后赋予i。在第二个例子中,float值的小数部分被丢弃,因为整数不支持小数值,这是一个不安全的类型转换例子。

指针类型的隐式转换也遵循C99规范中描述的规则。不允许内置矢量数据类型之间进行隐式转换。例如:

float4 f;
int4 i;
f = i; //illegal implicit conversion between vector data types

常规算术转换

有些需要算术类型(整数或浮点类型)操作数的操作符可能会带来转换,并以类似的方式得到结果类型。我们的目的是为操作数和结果确定一个通用的真实类型。对于指定的操作数,各操作数会转换(不改变类型域)为另外一个类型,其相应的真实类型为通用真实类型。为此,我们认为所有矢量类型比标量有更高的转换等级。除非另外明确说明,否则一般来讲通用真实类型也是结果的相应真实类型,如果操作数相同而且很复杂,那么结果的类型域就是操作数的类型域。这种模式称为常规算术转换( usual arithmetic conversion)。

如果操作数是多个矢量类型,则会出现一个编译时错误。矢量类型之间的隐式转换是不允许的;否则,如果只有一个矢量类型,而且所有其他操作数都是标量类型,那么这些标量类型会转换为矢量元素的类型,再宽化为一个新矢量,其中包含原矢量相同数目的元素,这里会把标量值全面复制到这个新矢量。如果某个标量操作数的等级大于矢量元素的类型,就会产生一个编译时错误。对此,等级顺序定义如下:
1)如果一个浮点类型可以准确地表示另一个浮点类型中的所有数值,那么第一个浮点类型的等级大于第二个浮点类型(对此,使用浮点值编码,而不是设备可用编码的子集)。
2)任何浮点类型的等级都大于整数类型的等级。
3)整数类型的等级大于精度较低的整数类型的等级。
4)无符号整数类型的等级大于有相同精度的、有符号整数类型的等级。
5)bool的等级小于所有其他类型。
6)枚举类型的等级等于兼容的整数类型的等级。
7)对于所有类型T1、T2和T3,如果T1的等级大于T2,而且T2的等级大于T3,则T1的等级大于T3。

否则,如果所有操作数都是标量,则按C99规范中定义应用常规算术转换。下面是矢量以及矢量和标量操作数合法使用算术转换的一些例子:

short a;
int4 b;
int4 c = b + a;

在这个例子中,变量a(类型为short)转换为int4,然后完成矢量加法。

int a;
float4 b;
float4 c = b + a;

在前面的例子中,变量a(类型为int)转换为float4,然后完成矢量加法。

float4 a;
float4 b;
float4 c = b + a;

在这个例子中,不需要完成任何转换,因为a、b和c都是相同的类型。下面是对矢量以及矢量和标量操作数非法使用常规算术转换的几个例子:

int a;
short4 b;
short4 c = b + a; //cannot convert & widen int to short4

double a;
float4 b;
float4 c = b + a; //cannot convert & widen double to float4

int4 a;
float4 b;
float4 c = b + a; //cannot cast between different vector types

显式强制类型转换

表4-1中定义的标量数据类型的标准类型强制类型转换会完成适当的变换(除了voidhalf以外)。在下面的例子中,f存储0x3F800000i存储0x1,这就是转换f中的浮点值1.0f得到的整数值:

float f = 1.0f;
int i = (int)f;

矢量类型之间的显式强制类型转换是不合法的。下面的例子会生成一个编译错误:

int4 i;
uint4 u = (uint4)i; //compile error

float4 f;
int4 i = (int4)f; //compile error

float4 f;
int8 i = (int8)f; //compile error

完成标量到矢量的转换后,会把标量强制转换为所需要的矢量数据类型。强制类型转换还会完成适当的算术转换。转换为内置整数矢量类型时会采用向零舍入模式。转换为内置浮点矢量类型时,则采用就近舍入模式。将bool强制转换为整数矢量类型时,如果这个bool值为true,则矢量分量设置为-1(也就是说,设置所有位为1);否则,设置为0

下面是显式强制类型转换的一些例子:

float4 f = 1.0f;
float4 va = (float4)f; //va is a float4 vector with elements(f,f,f,f)

uchar u = 0xFF;
float4 vb = (float4)u; //vb is a float4 vector with elements ((float)u,(float)u,(float)u,(float)u)

float f = 2.0f;
int2 vc = (int2)f; //vc is an int2 vector with elements ((int)f,(int)f)

uchar4 vtrue = (uchar4)true; //vtrue is a uchar4 vector with elements(0xFF,0xFF,0xFF,0xFF)

显式转换

不允许在矢量类型之间完成隐式转换和显式强制类型转换。不过,有些情况下我们可能需要将一个矢量类型转换为另一个类型。另外,可能有必要指定完成转换时使用的舍入模式,以及转换的结果是否饱和。这对于标量和矢量数据类型都很有用。

考虑下面的例子:

float x;
int i = (int)x;

在这个例子中,x中的值截断为一个整数值,并存储在i中。也就是说,将浮点值转换为一个整数值时,强制类型转换会完成向零舍入。

有时,我们需要将浮点值舍人为最接近的整数。下面的例子展示了通常如何做到这一点:

float x;
int i = (int)(x + 0.5f);

对于大多数x值,这都能正确工作,除非x0.5f -1 ulp或者x是一个负数。x0.5f -1 ulp时,(int)(x + 0.5f)返回1。也就是说,它会向上舍入而不是向下舍入。x是一个负数时,(int) (x + 0.5f)会向下舍入而不是向上舍入。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <float.h>

int main(void)
{
	float a = 0.5f;
	float b = a - nextafterf(a, (float)-INFINITY); // a - 1 ulp
	printf("a = %8x, b = %8x\n", *(unsigned int*)&a, *(unsigned int*)&b);
	printf(" (int) (a + 0.5f) = %d \n", (int)(a + 0.5f));
	printf(" (int) (b + 0.5f) = %d \n", (int)(b + 0.5f));
}

在这里插入图片描述
可以增加适当的检查来查看x的值,然后完成正确的转换,这样做可以修正这些问题,不过还有一些硬件能够根据大多数设备上的舍入和饱和设置完成这些转换。从性能的角度来看,这很重要:OpenCL C允许开发人员使用适当的硬件ISA完成这些转换而不是借助于在软件中模拟。正是因为这个原因,OpenCL实现了一些内置函数,可以基于一些选项(选择饱和度和4种舍入模式之一)完成一种类型到另一种类型的转换。

可以使用以下函数完成显式转换:

destType convert_destType><_sat><_roundingMode>(sourceType)
destType convert_destTypen><_sat><_roundingMode>(sourceTypen)

这些函数为标量类型(char、uchar、short、ushort、int、uint、long、ulong、float、double、half)和由这些标量类型衍生的内置矢量类型提供了各种转换。操作数和结果类型必须有相同数目的元素。操作数和结果类型可能是相同的类型,在这种情况下,转换对类型或值没有任何影响。

在下面的例子中,convert_int4将一个uchar4矢量u转换为int4矢量c

uchart4 u;
int4 c = convert_int4(u);

在下一个例子中,convert_int将一个float标量f转换为int标量i

float f;
int i = convert_int(f);

舍入模式修饰符可选,如下所示。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:数据库的增删查改

我们这一篇主要介绍数据库的增删查改~ 增&#xff1a;insert into 表名 value (); 删&#xff1a;delete from 表名; 查&#xff1a;select from 表名; 改&#xff1a;update 表名; 目录 1.insert&#xff08;增&#xff09; 2.select&#xff08;查询&#xff09; 2.1 全列…

Goby 漏洞更新 |Telesquare TLR-2005Ksh 路由器 ExportSettings.sh 文件下载漏洞(CVE-2021-46423)

漏洞名称&#xff1a;Telesquare TLR-2005Ksh 路由器 ExportSettings.sh 文件下载漏洞&#xff08;CVE-2021-46423&#xff09; English Name&#xff1a;Telesquare TLR-2005Ksh ExportSettings.sh file download (CVE-2021-46423) CVSS core: 7.5 影响资产数&#xff1a;2…

勒索病毒“顽疾”,没有“特效药”吗?

基础设施瘫痪、企业和高校重要文件被加密、毕业论文瞬间秒没……这就是六年前的今天&#xff0c;WannaCry勒索攻击爆发时的真实场景。攻击导致150多个国家数百万台计算机受影响&#xff0c;也让勒索病毒首次被全世界广泛关注。 六年后&#xff0c;勒索攻击仍是全球最严重的网络…

bootp引导程序协议

bootp又称为引导程序协议,我们来简单了解一下这个协议以及他的用法。 1&#xff0c;BOOTP 请求和应答均被封装在 U D P数据报中 &#xff1b; 2&#xff0c;B O O T P使用 U D P&#xff0c;且通常需与 T F T P协同工作&#xff1b; 3&#xff0c;B O O T P有两个熟知端口&a…

选择合适的 MQTT 云服务:一文了解 EMQX Cloud Serverless、Dedicated 与 BYOC 版本

引言 EMQX Cloud 是基于 EMQX Enterprise 构建的一款全托管云原生 MQTT 消息服务。为了满足不同客户的需求&#xff0c;EMQX Cloud 提供了三种版本供客户选择&#xff1a;Serverless 版、专有版和 BYOC 版。 本文将简要介绍这三个版本的核心区别&#xff0c;并通过三个用户故…

【ChatGPT】体验一下ChatGPT

体验一下ChatGPT 可以帮你写代码、写邮件、编故事的神器 最近OpenAI 发布了备受期待的原型通用 ChatGPT&#xff0c;这是一种基于对话的 AI 聊天界面&#xff0c;算是GPT-3(Generative Pre-trained Transformer 3)的继承者&#xff0c;今天记录一下体验的过程&#xff0c;以前…

详解set/map的底层结构——AVL树和红黑树

目录 前文 一&#xff0c;AVL树 1.1 什么是AVL树&#xff1f; 1.2 AVL树节点的定义 1.3 insert—插入(重点) 1.4 旋转(重点) 1.4.1 右单旋 1.4.2 左单旋 1.4.3 左右双旋 1.4.4 右左双旋 1.5 IsBalanc(平衡判断) 1.6 中序遍历 1.7 测试 二&#xff0c;红黑树 2.1 什么…

非常提效的7款原型工具推荐

原型图工具允许在开发前进行测试和迭代过程&#xff0c;可以帮助节省大量的开发时间和成本。在本文中&#xff0c;我们盘点了7个易于使用的原型图工具&#xff0c;以提高您的生产力&#xff01; 1.即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&…

自学黑客,一般人我劝你还是算了吧!

我为啥说自学黑客&#xff0c;一般人我还是劝你算了吧&#xff01;因为我就是那个不一般的人。 首先我谈下对黑客&网络安全的认知&#xff0c;其实最重要的是兴趣热爱&#xff0c;不同于网络安全工程师&#xff0c;他们大都是培训机构培训出来的&#xff0c;具备的基本都是…

【Python入门】Python的判断语句(if elif else语句)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

从0开始学习数据库

一个数据库最重要的部分是什么&#xff1f; 关系型数据库mysql有着四大特性&#xff0c;原子性&#xff0c;隔离性&#xff0c;一致性&#xff0c;持久性。 kv数据库有着原子性&#xff0c;持久性&#xff0c;弱一致性。 可见&#xff0c;不管数据库的存储引擎是什么&#xff0…

【计算机网络】第一章 计算机网络基础(期末急救包)

目录 前言 正文 考点 1.1 计算机网络组成 1.2 计算机网络的分类 ——4种 1.3计算机网络的性能指标 1.4 计算机网络标准化工作及相关组织 2.计算机网络体系结构与模型 结语 前言 期末将至&#xff0c;相信有的同学们还在为怎么过期末而发愁吧&#xff01;不用担心&#…

谈「效」风生 | 「自动化」聊起来简单,做起来难

#第4期&#xff1a;“自动化”聊起来简单&#xff0c;做起来难# 在上一期《如何找到现有研发体系的「内耗问题」》中&#xff0c;我们聊了评估现有研发体系&#xff0c;正确的找到“体系内耗问题”&#xff0c;是改变研发体系的第一步。本期我们继续聊下一个关键点就是研发体系…

多USB工业相机的使用

USB相机的使用 USB3.0引入了“SuperSpeed”(SS)传输速率。理论传输速度高达625 MByte/s, SuperSpeed传输可以在短时间内传输大量数据&#xff0c;适用于许多视觉应用。给出的带宽上限是一个理想化的理论值。对于实际应用&#xff0c;主机控制器&#xff08;Host Controller&am…

红黑树下岗,内核新数据结构上场:maple tree!

在外界看来&#xff0c;Linux 内核的内部似乎变化很少&#xff0c;尤其是像内存管理子系统&#xff08;memory-management subsystem&#xff09;这样的子系统。然而&#xff0c;开发人员时常需要更换内部接口来解决某些长期存在的问题。比如&#xff0c;其中一个问题就是用来保…

五个程序员必要的在线绘图工具

说到程序员&#xff0c;每个人的第一反应都是敲代码。事实上&#xff0c;画图也是程序员必备的技能之一。各种流程图、架构图、UML类图、线框图等多种多样。 1.即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使用&#xff…

算法修炼之练气篇——练气七层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

Recoil在React中完整实践方案

先让我吐槽一下&#xff0c;Recoil这个玩意文档是真的不友好&#xff0c;另外发现国内很少有人去用Recoil&#xff0c;然后好多文章都是照搬官网文档&#xff0c;我特喵的要是出了问题直接看官方不就行了。如果你碰巧看到这个文章了&#xff0c;就细心看完吧&#xff0c;绝对的…

从一文不值到数字黄金 诞生于极客圈的比特币,究竟经历了什么?

比特币作为技术性很强的神奇发明&#xff0c;从一文不值到数字黄金&#xff0c;在发展过程中不仅为金融范式转变奠定了基础&#xff0c;改变了人们感知和交易价值的方式&#xff0c;也为无数数字资产开辟了一条可追随的道路。 比特币之所以复杂&#xff0c;是因为技术属性、金融…

在线未注册域名批量查询-域名注册批量查询

域名批量注册查询 域名批量注册查询是一种工具&#xff0c;可以帮助用户批量查询并注册多个域名。这种工具通常被域名管理者、品牌专家、互联网营销人员等使用。 以下是域名批量注册查询工具的优点&#xff1a; 提高效率&#xff1a;与手动单独注册域名相比&#xff0c;域名批…