OpenCL编程指南-4.2矢量数据类型

news2024/11/26 23:35:20

矢量数据类型

OpenCL C还增加了对矢量数据类型的支持。矢量数据类型如下定义,首先是类型名,具体包括char、uchar、short、ushort、int、uint、float、long或ulong,后面是一个字面值n来定义矢量中的元素个数。对于所有矢量数据类型,支持的n值包括2、3、4、8和16。另外,还可以为doublehalf定义矢量数据类型,不过只有当设备支持双精度和半精度扩展时才可用。支持的矢量数据类型见表4-2。
在这里插入图片描述
声明为一个标量或矢量数据类型的变量要按所用数据类型的大小(字节数)对齐。内置数据类型大小必须按2的幂(字节数)对齐。如果一个内置数据类型的大小(字节数)不是2的幂,则要按紧邻的下一个2的幂值对齐(即大于它的最小的2的幂值)。这个规则不适用于结构(struct)或联合(union)。

例如,一个float4变量要按16字节边界对齐,char2变量要按2字节边界对齐。对于一个包含3个分量的矢量数据类型,这个数据类型的大小为4×sizeof(分量)。这说明包含3个分量的矢量数据类型要按4×sizeof(分量)边界来对齐。

OpenCL编译器负责根据数据类型适当地将数据项对齐。只有声明为一个数据类型指针的内核函数参数例外。对于这些函数,编译器假设指针所指向的对象总会按数据类型适当地对齐。

为了便于应用并确保数据存储能正确地对齐,表4-3列出了应用程序可用的一些数据类型。
在这里插入图片描述

矢量字面量

可以用矢量字面量由一组标量、矢量或标量和矢量的组合创建矢量。矢量字面量可以作为矢量初始化语句,也可以作为基本表达式,但不能作为左值。

矢量字面量的写法如下:首先是一个用括号括起的矢量类型,后面是一个用括号括起的参数列表,各参数之间用逗号分隔。矢量字面量会作为一个重载函数处理。可用的函数形式为可能的参数列表集合,其中所有参数与结果矢量有相同的元素类型,而且元素总数等于结果矢量中元素的个数。另外,还可以采用一种单个标量的形式,该标量的类型要与矢量的元素类型相同。例如,对于float4可以采用以下形式:

(float4) (float, float, float, float)
(float4) (float2, float, float)
(float4) (float, float2, float)
(float4) (float, float, float2)
(float4) (float2, float2)
(float4) (float3, float)
(float4) (float, float3)
(float4) (float)

操作数按函数计算的标准规则来计算,除非没有适用的隐式标量宽化规则。操作数会按其在内存中出现的顺序指定到结果矢量中相应的位置上。也就是说,第一个操作数的第一个元素指定到result.x,第一个操作数的第二个元素指定到result.y(或者如果第一个操作数是一个标量,则将第二个操作数的第一个元素指定到result.y),以此类推。如果操作数是一个标量,那么这个操作数会复制到结果矢量的所有分量。

下面的例子显示了由一个标量列表创建的矢量float4

float4 f = (float4)(1.0f, 2.0f, 3.0f, 4.0f);

下面的例子显示了由一个标量创建的矢量uint4,这个标量会复制到矢量的所有分量中:

uint4 u = (uint4)(1); //u will be (1,1,1,1)

下面几个例子展示了使用一个标量和一些较小矢量类型创建更为复杂的矢量组合:

float4 f = (float4)((float2)(1.0f, 2.0f), (float2)(3.0f, 4.0f));
float4 f = (float4)(1.0f, (float2)(2.0f, 3.0f), 4.0f);

下面展示了非法创建矢量字面量的几个例子。所有这些例子都会导致一个编译错误。

float4 f = (float4)(1.0f, 2.0f);
float4 f = (float2)(1.0f, 2.0f);
float4 f = (float4)(1.0f, (float2)(2.0f, 3.0f));

矢量分量

在有1~4个分量(即元素)的矢量数据类型中,其分量可以表示为<vector>.xyzw。表4-4列出了不同矢量类型可访问的分量。

char2 uchar2 short2 ushort2 int2 uint2 long2 ulong2 float2        .xy
char3 uchar3 short3 ushort3 int3 uint3 long3 ulong3 float3        .xyz
char4 uchar4 short4 ushort4 int4 uint4 long4 ulong4 float4        .xyzw
double2 half2                                                     .xy
double3 half3                                                     .xyz
double4 half4                                                     .xyzw

如果要访问那些超出矢量类型声明的分量,会得到一个错误。下面给出了合法和非法访问矢量分量的一些例子:

float2 pos;
pos.x = 1.0f; //is legal
pos.z = 1.0f; //is illegal

float3 pos;
pos.z = 1.0f; //is legal
pos.w = 1.0f; //is illegal

利用分量选择语法,可以在点号(.)后面追加分量名来选择多个分量。下面给出几个例子来了解如何使用分量选择语法:

float4 c;
c.xyzw = (float4)(1.0f, 2.0f, 3.0f, 4.0f)
c.z = 1.0f;
c.xy = (float2)(3.0f, 4.0f);
c.xyz = (float3)(3.0f, 4.0f, 5.0f);

利用分量选择语法还允许交换或复制分量,如下面的例子所示:

float4 pos = (float4)(1.0f, 2.0f, 3.0f, 4.0f);
float4 swiz = pos.wzyx; //swiz = (4.0f, 3.0f, 2.0f, 1.0f)
float4 dup = pox.xxyy; //dup = (1.0f, 1.0f, 2.0f, 2.0f)

还可以使用数值索引(指向矢量中相应的元素)访问矢量分量。数值索引的用法如表4-5所示
在这里插入图片描述
所有数值索引前面必须加上字母s或s。对于下面的例子,f.s0指示float8变量f的第1个元素。f.s7指示float8变量f的第8个元素。

float8 f

在下面的例子中,x.sa(或x.sA)指示float16变量x的第11个元素,x.sf(或x.sF)指示float16变量x的第16个元素:

float16 f

数值索引不能与.xyzw记法混合使用。例如:

float4 f;
float4 v_A = f.xs123; //is illegal
float4 v_B = f.s012w; //is illegal

矢量数据类型可以使用.lo (或.odd)和.hi(或.even)后缀来得到较小的矢量类型,或者把较小的矢量类型结合为一个较大的矢量类型。还可以使用多层.lo(或.odd)和.hi(或.even)后缀,直至指向一个标量类型。

.lo后缀指示一个给定矢量的低半部分。.hi后缀指示给定矢量的高半部分。.odd后缀指示给定矢量的奇数元素。.even后缀指示给定矢量的偶数元素。下面给出一些例子来说明这个概念:

float4 vf;

float2 low = vf.lo; //returns vf.xy
float2 high = vf.hi; //returns vf.zw
float x = low.low; //returns low.x
float y = low.hi; //returns low.y
float2 odd = vf.odd; //returns vf.yw
float2 even = vf.even; //returns vf.xz

对于一个包含3个分量的矢量,处理后缀.lo(或.odd)和.hi(或.even)时会把这个3分量的矢量当做一个4分量的矢量来处理,其w分量中的值未定义。

其他数据类型

OpenCL C支持的其他数据类型

image2d_t      2D图像类型
image3d_t      3D图像类型
sampler_t      图像采样器类型
event_t        事件类型。
               完成从全局内存到局部内存(以及从局部内存到全局内存)异步复制的内置函数会使用这些事件类型。
               每个异步复制操作会返回一个事件,并接收一个所等待的事件(该事件标识之前的一个异步复制操作)

对于图像和采样器类型的使用,存在一些限制:
1)只有当设备支持图像时才能定义图像和采样器类型。
2)图像和采样器类型不能声明为数组。下面的几个例子展示了一些不合法的用法。

kernel void foo(image2d_t imgA[10]) //error images cannot be declared as arrays
{
     image2d_t imgB[4]; //error images cannot be declared as arrays
     ...
}

kernel void foo(sampler_t smpA[10]) //error samplers cannot be declared as arrays
{
     sampler_t smpB[4]; //error samplers cannot be declared as arrays
     ...
}

1)不能在结构(struct)中声明image2d_timage3d_tsampler_t数据类型
2)变量不能声明为image2d_timage3d_tsampler_t数据类型的指针。

衍生类型

对于这些衍生类型的使用有一些限制:
1)如果结构或结构指针用做一个内核函数的参数类型,则该结构类型不能包含任何指针。例如,下面的用法是不合法的。

typedef struct {
    int x;
    global float *f;
} mystruct_t;
kernel void foo(global mystruct_t *p) //error mystruct_t contains a pointer
{
    ...
}

2)只有当结构或结构指针用做一个非内核函数的参数类型,或者声明为一个内核或非内核函数中的变量时,该结构类型才能包含指针。例如,以下用法是合法的。

void my_func(mystruct_t *p)
{
   ....
}

kernel void foo(global int *p1, global float *p2)
{
     mystruct_t s;
     s.x = p1[get_global_id(0)];
     s.f = p2;
     my_func(&s);
}

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

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

相关文章

ANR原理篇 - ANR信息收集过程

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、ANR日志信息收集过程ANR日志收集完整流程1.1 logcat中信息记录1.2 trace.txt文…

《微服务实战》 第九章 Gitlab使用

前言 微服务项目&#xff0c;常常需要多人协作完成工作&#xff0c;本章教程是介绍Gitlab使用&#xff0c;使多人协作告别低端的手动拷贝&#xff0c;也告别传统的SVN。 1、下载安装git https://git-scm.com/download/win 1.1、安装好以后&#xff0c;cmd中输入git 2、生成…

什么是Docker 【微服务框架】

Docker Docker如何解决依赖的兼容问题&#xff1f; 将应用的Libs&#xff08;函数库&#xff09;、Deps&#xff08;依赖&#xff09;、配置与应用一起打包将每个应用放到一个隔离容器去运行&#xff0c;避免互相干扰 不同环境的操作系统不同&#xff0c;Docker如何解决&#…

(数字图像处理MATLAB+Python)第八章图像复原-第一、二节:图像复原概述和图像退化模型

文章目录 一&#xff1a;图像复原概述二&#xff1a;图像退化模型&#xff08;1&#xff09;连续退化模型&#xff08;2&#xff09;离散退化模型 三&#xff1a;图像退化函数的估计&#xff08;1&#xff09;基于模型的估计法&#xff08;2&#xff09;运动模糊退化估计 一&am…

理解JS的事件循环机制(Event Loop)

文章目录 一、前言二、首先理解三、灵魂三问1. JS为什么是单线程的?2. 为什么需要异步? &#xff08;为什么要有事件循环机制&#xff1f;&#xff09;3. 单线程又是如何实现异步的呢? 四、什么是事件循环&#xff1f;五、事件循环&#xff08;Event Loop &#xff09;执行顺…

哈工大软件架构与中间件作业1

《软件架构与中间件》作业1报告 ——作业1&#xff1a;软件架构 姓名&#xff1a; 石卓凡 学号&#xff1a; 120L021011 目录 项目介绍......................................................................................................…

混淆(Proguard R8)和反混淆

本篇来介绍下Android的混淆和反混淆&#xff0c;说起混淆&#xff0c;大家都会很自然地想到Proguard&#xff0c;此外还有R8。事实上&#xff0c;AGP3.3之后&#xff0c;官方默认使用R8做代码优化、混淆和压缩。ProGuard和R8常常用于混淆最终的Android项目&#xff0c;增加项目…

【加载更多 Objective-C语言】

一、咱们上午就做了两件事儿, 1.把我们的数据,加载起来, 2.实现了下面这个”加载更多“按钮的功能, 3.只不过,我们加载数据的时候,用了一个自定义cell, 那么,基本加载数据的办法,我就不再说了, 基本,就是那些步骤, 只是把我们自定义cell部分,再给大家复习一下…

【C语言】宏实现一个整数的二进制位的奇数位和偶数位交换

要写一个宏实现将一个整数的二进制位的奇数位和偶数位交换&#xff0c;我们首先要分析如何将一个整数的二进制位的奇数位和偶数位交换 以下以整数7为例 7的二进制&#xff1a; 0000 0000 0000 0000 0000 0000 0000 0111 7 奇数位与偶数位交换后为&#xff1a; 0000 0000 0000 …

一周狂赚50万,GPT-4帮你在线“脱单”,AI女友按分钟收费,在线男友数量多达1000+

电影情节照进现实 不知道大家有没有看过一部电影《她》&#xff0c;讲述的是在不远的未来人与人工智能相爱的科幻爱情电影。主人公西奥多和人工智能系统OS1的化身萨曼莎在相处中&#xff0c;发现彼此之间都存在双向的需求与欲望&#xff0c;人机友谊最终发展成为一段不被世俗理…

Zookeeper 分布式应用程序的分布式协调服务

老规矩学习一个新技术首先从它的官网入手&#xff1a;Apache ZooKeeper 概览 一谈到集群&#xff0c; 从结构上看&#xff1a; 主从集群&#xff1a;主从集群就可以做读写分离&#xff0c;写在主、读在从无主集群&#xff08;比如redis cluster&#xff09; 从数据上看&…

10---正则表达式匹配

给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示例 1&#xff1a; 输入&#xff1a;s…

JavaEE 数据链路层 以太网协议

网络原理补充-数据链路层与以太网协议 文章目录 JavaEE & 网络原理补充-数据链路层 & 以太网协议1. 以太网数据帧1.1 帧头帧尾1.2 类型1.3 载荷 2. IP数据报补充2.1 16位标识2.2 13位片偏移2.3 3位标识 3. DNS3.1 DNS原理3.2 DNS劫持或者污染 JavaEE & 网络原理补…

MongoDB 查询文档中使用文本选择器($text)

之前我们介绍过使用比较选择器、逻辑选择器、元素选择器、数组选择器查询文档&#xff0c;如果您需要进一步了解&#xff0c;可以参考&#xff1a; MongoDB 查询文档中使用比较选择器、逻辑选择器https://blog.csdn.net/m1729339749/article/details/129965699 MongoDB 查询文…

IHS安装ssl证书

1、向专业机构申请证书&#xff0c;或者使用openssl生成自签名证书&#xff0c;openssl生成证书参考以下步骤。 openssl生成证书参考https://blog.51cto.com/longlei/2120718 生成加密私钥 [rootlocalhost test]# openssl genrsa -out test.key 2048 Generating RSA private…

直线模组常见故障的解决方法

直线模组因其具有单体运动速度快、重复定位精度高、本体质量轻、占设备空间小、寿命长等特点&#xff0c;运用的范围一直在扩大&#xff0c;发展至今&#xff0c;已经被广泛应用到各种各样的设备当中。 在直线模组的使用过程中&#xff0c;或多或少都会出现一些问题&#xff0c…

DUBBO 3.x 兼容 invoke 调用

从DUBBO的2.7.22版本升级到了3.x的版本后&#xff0c;发现invoke失灵了 首先是启动报错&#xff0c;注释掉配置 dubbo.protocol.telnetinvoke后程序可运行&#xff0c;但是invoke失效。 通过对比源码 示例&#xff1a; tag-3.0.10 tag-2.7.22 发现3.0.2之后的版本都移除了i…

【网络编程】UDP简单实现翻译软件与网络聊天室

文章目录 一、引入二、翻译软件实现2.1 加载字典2.2 处理数据并传递给用户端2.3 客户端获取结果2.4 结果2.5 执行命名功能 三、网络聊天室实现3.1 管理用户3.2 发送消息3.3 多线程处理3.4 结果 四、源码 一、引入 在上一章【网络编程】demo版UDP网络服务器实现实现了客户端和服…

(1分钟了解)视觉惯性导航初始化方法综述

视觉惯性导航初始化方法综述 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 初始化相关的简介&#xff0c;在这里知道初始化方法可以分为联合初始化、非联合初始化和半联合初始化三种方法即可。 ​ 编辑切换为居中 添加图片注释&…

VIM学习笔记 正则表达式-(vimgrep/grep)

在UNIX问世的前一年&#xff0c;1969年&#xff0c;Ken Thompson将正则表达式整合入QED文本编辑器。在Linux文本编辑器ed中&#xff0c;如果你希望显示包含字母“re”的行时&#xff0c;需要使用命令g/re/p&#xff0c;而grep也因此得名。可以看作此操作的缩写&#xff1a;g (g…