OpenCL编程指南-4.4矢量操作符
矢量操作符
如下描述了可用于矢量数据类型或矢量和标量数据类型组合的各类操作符。


算术操作符
算术操作符(加(+)、减(–)、乘(*)和除(/)),可以作用于内置整数、浮点标量和矢量数据类型。取余操作符(%)只能用于内置整数标量和矢量数据类型。可能有以下情况:
1)两个操作数都是标量。在这种情况下,操作遵循C99规则。
2)一个操作数是标量,另一个是矢量。可以根据常规算术转换将这个标量操作数转换为矢量操作数使用的元素类型,然后宽化为一个矢量,这个新矢量与矢量操作数的元素个数相同。将逐分量地应用操作,得到一个相同大小的矢量。
3)两个操作数是相同类型的矢量。在这种情况下,会逐分量地应用操作,得到相同大小的矢量。
对于整数类型,除以0或者可能得到越界值的除法不会导致异常,而只是得到一个未定义值。对于浮点类型,根据IEEE 754标准的规定,除以0会得到±∞或NaN。
可以通过几个例子来说明一个操作数是标量而另一个操作数是矢量时,算术操作符如何工作,或者两个操作数都是矢量时,算术操作符如何工作。
图4-3中的第一个例子显示了将两个矢量相加:

int4 v_iA = (int4)(7, -3, -2, 5);
int4 v_iB = (int4)(1, 2, 3, 4);
int4 v_iC = v_iA + v_iB;
相加的结果存储在矢量v_iC中:(8, -1, 1, 9)。
图4-4中的例子显示了一个乘法运算,这里操作数分别为一个矢量和一个标量。在这个例子中,只是将标量按矢量的大小宽化,再将各矢量的分量相乘:

float4 vf = (float4)(3.0f, -1.0f, 1.0f, -2.0f);
float4 result = vf * 2.5f;
存储在矢量result中的乘法结果是(7.5f, -2.5f, 2.5f, -5.0f)
图4-5中的例子显示了可以将一个矢量和一个标量相乘,这里标量会隐式地转换和宽化:

float4 vf = (float4)(3.0f, -1.0f, 1.0f, -2.0f);
float4 result = vf * 2;
存储在矢量result中乘法结果是(6.0f, -2.0f, 2.0f, -4.0f)
关系和相等操作符
关系操作符(大于(>)、小于(<)、大于或等于(>=)和小于或等于(<= )),以及相等操作符(等于(==)和不等于(!=)),可以作用于内置整数、浮点标量和矢量数据类型。结果是一个整数标量或矢量类型。
可能有以下情况:
1)两个操作数都是标量。在这种情况下,操作遵循C99规则。
2)一个操作数是标量,另一个操作数是矢量。可以根据常规算术转换将标量操作数转换为矢量操作数使用的元素类型,然后宽化为一个矢量,这个新矢量与矢量操作数的元素个数相同。逐分量地应用操作,得到相同大小的矢量。
3)两个操作数是相同类型的矢量。在这种情况下,逐分量地应用操作,得到相同大小的矢量。
如果两个源操作数都是标量,结果就是一个类型为int的有符号整型标量;如果操作数是矢量,则结果是与矢量源操作数大小相同的、有符号的整数类型矢量;如果源操作数是charn,或ucharn,则结果类型为charn;如果源操作数为 shortn、ushortn或halfn,则结果类型为shortn;如果源操作数为intn、uintn或floatn,结果类型就是intn;如果源操作数为longn、ulongn或doublen,则结果类型为longn。
对于标量类型,如果指定的关系为假,则这些操作符返回0;如果指定关系为真,则返回1。对于矢量类型,如果指定关系为假,则这些操作符返回0;如果指定的关系为真,则操作符返回-1 (即,所有位均设置为1)。如果某一个或两个参数不是一个数(NaN),则关系操作符总返回0。如果某一个或两个参数不是一个数(NaN),相等操作符“等于”(==)总返回0。如果某一个或两个参数不是一个数(NaN)时,“不等于”操作符(! =)返回1(对于标量源操作数)或-1(对于矢量源操作数)。
位操作符
位操作符(位与(&)、位或((|)、异或(^)和非(~)),可以作用于内置整数标量和矢量数据类型。结果是一个整数标量或矢量类型。可能有以下情况:
1)两个操作数都是标量。在这种情况下,操作遵循C99规则。
2)一个操作数是标量,另一个是矢量。可以根据常规算术转换将这个标量操作数转换为矢量操作数使用的元素类型,然后宽化为一个矢量,这个新矢量与矢量操作数的元素个数相同。逐分量地应用操作,得到一个相同大小的矢量。
3)两个操作数是相同类型的矢量。在这种情况下,逐分量地应用操作,得到相同大小的矢量。
逻辑操作符
逻辑操作符(与(&&)或(I)),可以作用于内置整数标量和矢量数据类型。结果是一个整数标量或矢量类型。可能有以下情况:
1)两个操作数都是标量。在这种情况下,操作遵循C99规则。
2)一个操作数是标量,另一个是矢量。可以根据常规算术转换将这个标量操作数转换为矢量操作数使用的元素类型,然后宽化为一个矢量,这个新矢量与矢量操作数的元素个数相同。逐分量地应用操作,得到一个相同大小的矢量。
3)两个操作数是相同类型的矢量。在这种情况下,逐分量地应用操作,得到相同大小的矢量。
如果两个源操作数都是标量,逻辑操作符“与”(&&)只有在左操作数不等于О的情况下才会计算右操作数,逻辑操作符“或”(||)仅当左操作符等于0的情况下才会计算右操作数。如果其中一个或两个源操作数为矢量类型,那么两个操作数都会计算。
如果两个源操作数都是标量,结果是一个int类型的有符号整数标量;如果源操作数是矢量,结果是有相同大小的有符号整数类型矢量。如果源操作数是charn或ucharn,结果类型为charn;如果源操作数为 shortn或ushortn,则结果类型为shortn;如果源操作数为intn或uintn,结果类型就是intn;如果源操作数为longn或ulongn,则结果类型为longn。
对于标量类型,如果指定的关系为假,这些操作符会返回0;如果指定关系为真,则返回1。对于矢量类型,如果指定关系为假,则这些操作符会返回0;如果指定的关系为真,则操作符返回-1(即,所有位均设置为1)。
逻辑排除操作符(^^)保留,以备将来使用。
条件操作符
算术一元操作符(+和-)作用于内置标量和矢量数据类型。
算术后自增和前自增(++)以及后自减和前自减(--)操作符作用于内置标量和矢量数据类型(但不包括内置浮点标量和矢量数据类型)。这些操作符会对其操作数逐分量地进行处理,最后得到与所处理操作数相同的类型。
逻辑一元操作符“非”(!)作用于内置标量和矢量数据类型(但不包括内置浮点标量和矢量数据类型)。这些会对其操作数逐分量地进行处理。如果源操作数是标量,则结果是一个int类型的有符号整数标量;如果源操作数是矢量,则得到相同大小的有符号整数类型矢量;如果源操作数是charn或ucharn,结果类型为charn;如果源操作数为shortn或ush-ortn,则结果类型为shortn;如果源操作数为intn或uintn,结果类型就是intn;如果源操作数为longn或ulongn,则结果类型为longn。
对于标量类型,如果指定的关系为假,则这些操作符会返回0;如果指定关系为真,则返回1。对于矢量类型,如果指定关系为假,则这些操作符会返回0;如果指定的关系为真,则操作符返回-1(即,所有位均设置为1)。
逗号操作符(,)作用于表达式,返回一个逗号分隔的表达式列表中最右表达式的类型和值。所有表达式都会从左到右按顺序计算。例如:
//comma acts as a separator not an operator
int a = 1, b = 2, c = 3, x;
//comma acts as an operator
x = a += 2, a + b; //a=3,x=5
x = (a, b, c); //x=3
sizeof操作符会得到其操作数的大小(字节数)。结果是一个整数值。如果操作数的类型为char或uchar,则结果为1;如果操作数类型为short、ushort或half,则结果为2;如果操作数类型为int、uint或float,则结果为4;如果操作数类型为long、ulong或double,则结果为8;如果操作数是一个矢量类型(包含3个分量的矢量除外),则结果是(矢量中分量个数)*(各标量分量的大小),对于包含3个分量的矢量,结果则是4*(各标量分量的大小);如果操作数是一个数组类型,则结果是该数组中的总字节数;如果操作数是一个结构或联合类型,则结果就是这个对象中的总字节数,包括内部或尾部填充的字节。
对image2d_t、image3d_t、sampler_t和event_t类型应用sizeof操作符的行为由具体实现定义。对于某些实现,sizeof(sampler_t) = 4,而在有些实现中,这个操作可能会导致一个编译时错误。为了保证跨OpenCL实现的可移植性,建议不要对这些类型使用sizeof操作符。
一元操作符(*)指示间接性。如果操作数指示一个对象,则结果是一个指示该对象的左值;如果操作数类型为“指向某个类型type的指针”,那么结果类型就是type。如果将一个非法值赋给该指针,则间接操作符的行为未定义。
一元操作符(&)返回其操作数的地址。
赋值操作符
为变量名赋值的操作由赋值操作符(=)完成,如:
lvalue = expression
赋值操作符将expression的值存储在lvalue 中。
可能出现以下情况:
1)两个操作数都是标量。在这种情况下,操作遵循C99规则。
2)一个操作数是标量,另一个是矢量。这个标量操作数显式转换为矢量操作数使用的元素类型,然后宽化为一个矢量,这个新矢量与矢量操作数的元素个数相同。逐分量地应用操作,得到一个相同大小的矢量。
3)两个操作数是相同类型的矢量。在这种情况下,逐分量地应用操作,得到相同大小的矢量。
以下表达式是等价的:
lvalue op = expression
lvalue = lvalue op expression
lvalue 和 expression 必须同时满足op和赋值操作符(=)的要求。
相关文章:
OpenCL编程指南-4.4矢量操作符
矢量操作符 如下描述了可用于矢量数据类型或矢量和标量数据类型组合的各类操作符。 算术操作符 算术操作符(加()、减(–)、乘(*)和除(/)),可以作用于内置整数、浮点标量和矢量数…...
索洛模型(二)
索洛模型(二) 文章目录 索洛模型(二)[toc]1 事实2 假设2.1 对生产函数的假设2.2对投入要素的假设 3 索洛模型的动态学3.1 k k k的动态学3.2 平衡增长路径 4 储蓄率变化的影响4.1 对产出的影响4.2 对消费的影响 索罗经济增长模型(Solow growth model)&am…...
【多微电网】基于粒子群优化算法的面向配电网的多微电网协调运行与优化(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
使用Atmel Studio开发Arduino的ATmega328P单片机
摘要:我们知道Arduino开发板常用的芯片是Atmel公司生产的AVR微控制器系列。最常见的是ATmega328P,被广泛用于Arduino Uno开发板。其他常用的AVR芯片包括ATmega2560和ATmega32U4。使用Arduino平台开发AVR的单片机非常方便。Arduino IDE提供了一个非常简洁…...
docker基础命令
查找镜像 docker search nginx 拉取镜像 不指定镜像版本的话默认拉取最新的版本,可以在dockerhub上查看镜像的版本 dockerhub地址:Docker docker pull nginx docker pull nginx:1.23 查看镜像列表 docker images 打包镜像 打包的镜像可以迁移到其它的主机上部署 …...
数组名+1和数组名+1的区别
数组名和&数组名区别 #include <stdio.h>int main() {int a[5] {1,2,3,4,5};int *ptr (int *)(&a 1);printf("%d,%d,%d\n",*(a 4),*(ptr - 1),*ptr); // 2 5 为什么是5printf("数组a[4]的地址%p,(ptr-1)地址%p, ptr的地址%p",(a 4)…...
开放原子训练营(第三季)inBuilder低代码开发实验室初体验
一、活动介绍 开放原子训练营开启inBuilder低代码实验室活动。无论您是计算机行业相关从业者、低代码开发爱好者还是普通用户,都可以基于inBuilder低代码开发平台社区版(基于UBML开源项目的一个可以广泛使用的发行版),体验向导式、…...
sql数据定义语句(cascade,set,null,no action的区别)
(一)ADD 基本格式: ALTER TABLE <表名> ADD 新属性名 新属性类型 例:alter table s1 add tele char(12):增加一个电话号码(tele)属性 注: 新增的属…...
Java进程(基础)
基本概念 1、进程:程序的执行过程 2、线程:一个进程可以有单个线程也就是我们说的单线程,还可以有多个线程也就是我们说的多线程, 线程 1、当一个类继承了Thread类就可以当成一个线程用 2、我们会重写run方法写上我们自己的业务…...
Android之 Activity活动详解
一 四大组件 1.1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行。 1.2 service组件,用于在后台完成用户指定的操作。 1.3 content provider组件,会为所有的应用准备一个内容窗口,并且保留数据库、…...
车载软件架构——闲聊几句AUTOSAR BSW(五)
我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们并不必要为了和谐,而时刻保持通情达理;我们需要具备的是,偶尔有肚量欣然承认在某些方面我们可能会有些不可理喻。该有主见的时候能掷地有声地镇得住场…...
APP图标尺寸规范一文了解清楚
在进行图标设计前,熟知手机 app 图标尺寸规范,能更好地去针对不同平台设计出更极致的图标。当前智能手机系统主要以 iOS 及 Android 为主,APP 图标是产品给用户的第一印象,图标视觉设计的美感与吸引力,与用户是否选择下…...
写给程序员Android Framework 开发,
前言 在 Android 开发者技能中,如果想进大厂,一般拥有较好的学历可能有优势一些。但是如果你靠硬实力也是有机会的,例如死磕Framework。Framework 知识广泛应用在Android各个领域中,重要性显而易见。 成为一名Android Framework…...
html实现一个一闪一闪的按钮,CSS实现一个一闪一闪的按钮,Css闪烁点标,css设置按钮层次感,css按钮美化,CSS按钮动画过渡,CSS按钮添加阴影
效果 动态 静态 实现 底部多加了几个过渡按钮 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>#app {margin: 2% auto;text-align: center;}.lay-btn-box {position: relative;display: …...
品优购项目学习记录04--列表页
文章目录 1.品优购项目列表页制作准备工作2.列表页header和nav修改2.1 秒杀logo的制作2.2 导航栏nav修改 3.列表页主体sk_container 1.品优购项目列表页制作准备工作 1.列表页面是新的页面,我们需要新建页面文件list.html 2.因为列表页的头部和底部基本一致&#x…...
script标签type值application/json,importmap和module
type(默认text/javascript) 该属性定义 script 元素包含或src引用的脚本语言。属性的值为 MIME 类型(媒体类型); 如果没有定义这个属性,脚本会被视作 JavaScript。 如果 MIME 类型不是 JavaScript 类型&a…...
基于ArcGIS实现陕西省1:250000比例尺地形图分幅和编号
1地形图的分幅与编号原理 我国1:1000000地形图的分幅采用国际1:1000000地图分幅标准,而其他比例尺地形图分幅以1:1000000比例尺地形图为基准进行分幅。每幅1:1000000地形图范围是经差6、纬差4;纬度60~ 76之间经差12、纬差4;纬度76~ 88之间经…...
校园安全,一键报警主机助力保障
校园安全,一键报警主机助力保障 随着社会发展和科技进步,校园安全问题日益受到重视。如何保障师生们的安全成为了学校一项重要任务。而校园可视一键报警主机就是一种非常有效的安保设备。 这种报警主机集合了视频监控、安全防范、数据处理等多个功能&a…...
RabbitMQ养成记 (7. 消息可靠性投递)
消息可靠性 什么是消息的可靠性呢?? 简单来说就是 你的消息发放给 exchange 这个过程中 有可能丢失或者失败 这时候需要一个回调机制来监控 发送结果 必要时还要返回信息。 rabbitmq 给我们提供了两种: 首先是生产者到exchange发送过程的监…...
SpringBoot配置连接两个或多个数据库
在Spring Boot应用中连接多个数据库或数据源可以使用多种方式,下面介绍两种常用的方法: 1、使用Spring Boot官方支持的多数据源配置 Spring Boot提供了官方支持的多数据源配置,可以简单地配置和管理多个数据源。 需要在application.proper…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
