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

news2024/10/6 8:32:17

矢量数据类型

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/518185.html

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

相关文章

母亲节快到了,祝所有母亲节日快乐!Happy Mother‘s Day

《游子吟》唐孟郊 慈母手中线&#xff0c;游子身上衣。 临行密密缝&#xff0c;意恐迟迟归。 谁言寸草心&#xff0c;报得三春晖。 My kind mother has a needle and thread in her hand,Making new clothes for her son who is to travel far away. She is busy sewing c…

FE_Vue学习笔记 Vue监视数据的原理

1 通过更新时的一个问题-this.personList[0] { 更新值 } 不起作用 引入 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript" src"…

每日一博 - 闲聊“突发流量”的应对之道

文章目录 概述思路 概述 面对“突发流量”的情况,我会采取以下应急措施: 扩容现有资源。这是最直接和最常用的方法。可以通过增加CPU、内存、节点等来扩容。典型案例是双11等大促期间,阿里会大规模扩容幕布等系统以应对流量激增。横向扩展,增加更多服务器或节点。通过增加服务…

lambda处理异常四种方式

最近对接第三方呼叫系统&#xff0c;第三方SDK的所有方法里都有异常抛出&#xff0c;因为用到了lambda&#xff0c;所以异常处理还是很必要的。 本文主要用到了四种解决方案&#xff1a; 直接代码块处理自定义函数式接口&#xff0c;warp静态方法通过Either 类型包装通过Pair 类…

目前收集到好用且免费的ChatGPT镜像站

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…

Linux——进程信号2

阻塞信号 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略…

一文4000字用Jmeter +Maven+jenkins实现接口性能全自动化测试

背景&#xff1a; 首先用jmeter录制或者书写性能测试的脚本&#xff0c;用maven添加相关依赖&#xff0c;把性能测试的代码提交到github&#xff0c;在jenkins配置git下载性能测试的代码&#xff0c;配置运行脚本和测试报告&#xff0c;配置运行失败自动发邮件通知&#xff0c…

分布式id解决方法--雪花算法

uuid&#xff0c;jdk自带&#xff0c;但是数据库性能差&#xff0c;32位呀。 mysql数据库主键越短越好&#xff0c;Btree产生节点分裂&#xff0c;大大降低数据库性能&#xff0c;所以uuid不建议。 redis的自增&#xff0c;但是要配置维护redis集群&#xff0c;就为了一个id&a…

【前后端分离博客】学习笔记01 --- 登录模块Sa-Token

前言 用于记录自己学习博客项目的流程 基于Springboot Vue3 开发的前后端分离博客 项目源码&#xff1a;Blog: 基于SpringBoot Vue3 TypeScript Vite的个人博客&#xff0c;MySQL数据库&#xff0c;Redis缓存&#xff0c;ElasticSearch全文搜索&#xff0c;支持QQ、Gite…

20230509MTCNN2

卷积切分图片 怎么切分图片? 使用opencv,PIL切分图片有什么问题? 慢 使用 卷积来切分图片 卷积的运算过程 类似于切图 卷积 对输入图片的尺寸 有没有 的要求? 就是 输入的图片尺寸 必须大于 卷积核的大小 test1.py import torch from torch import nn""&quo…

springboot + vue3实现视频播放Demo

文章目录 学习链接前言ffmpeg安装ffmpeg配置环境变量分割视频文件 后台配置WebConfig 前端代码video.js示例安装依赖视频播放组件效果 Vue3-video-play示例安装依赖main.js中使用视频播放组件效果 学习链接 ffmpeg官网 长时长视频java存储及vue播放解决方法 【 攻城略地 】vue…

BitKeep逆势崛起:千万用户的信任,终点还未到来

在全球范围内&#xff0c;BitKeep钱包如今已拥有超过千万忠实用户。 当我得知这一令人震撼的数字时&#xff0c;既感到惊讶&#xff0c;同时也觉得这是意料之中的事情。几年来关注BitKeep的发展历程&#xff0c;我深切地感受到了这家公司的蓬勃壮大。回顾2018年他们发布的第一个…

linux0.12-8-9-fork.c

[362页] 1、 verify_area函数给其他文件使用的&#xff0c;跳转开始位置&#xff1b; 2、 copy_mem函数复制内存页表&#xff1b; 3、 copy_process函数是fork.c主要函数&#xff1b; 4、find_empty_process函数就2个作用&#xff1a;在一个范围内找last_pid和找空槽&#xff1…

如何利用互联网优势进行茶叶销售?

茶叶是中国传统文化的重要组成部分&#xff0c;具有丰富的文化内涵和高度的营养价值。如今&#xff0c;随着互联网的普及&#xff0c;越来越多的茶叶销售商&#xff08;文章编辑ycy6221&#xff09;开始利用互联网的优势来开拓市场。本文将介绍如何利用互联网优势进行茶叶销售。…

SecureCRT的下载安装

亲测成功了&#xff0c;按照下面的步骤完成即可&#xff01; 下载安工具包包地址连接&#xff1a;网盘地址点击即可 提取码&#xff1a;0lp7 1、下载SecureCRT 2、从百度网盘下载SecureCRT&#xff0c;页面如下 3、安装SecureCRT 4、激活SecureCRT 第一步&#xff1a;打开安装…

自学Java怎么找工作?好程序员学员大厂面试经验分享!

简历要详细&#xff1a; 简历中的项目用到的技术点和个人负责的模块尽量写详细一些。其次&#xff0c;根据自己项目中用到的熟悉的技术点&#xff0c;在个人技能介绍模块去突出&#xff0c;面试官基本会根据你简历上写的去提问的&#xff0c;这样我们回答起来就会更加得心应手。…

【多线程初阶四】单例模式阻塞队列

目录 &#x1f31f;一、单例模式 &#x1f308;1、饿汉模式 &#x1f308;2、懒汉模式&#xff08;重点&#xff01;&#xff09; &#x1f31f;二、工厂模式 &#x1f31f;三、阻塞式队列 &#x1f308;1、阻塞队列是什么&#xff1f; &#x1f308;2、…

如何注册appuploader账号​

如何注册appuploader账号​ 我们上一篇讲到appuploader的下载安装&#xff0c;要想使用此软件呢&#xff0c;需要注册账号才能使用&#xff0c;今​ 天我们来讲下如何注册appuploader账号来使用软件。​ 1.Apple官网注册Apple ID​ 首先我们点击首页左侧菜单栏中的“常见网…

为什么企业选择局域网即时通讯软件?局域网即时通讯软件哪家好?

在当今互联网普及的时代&#xff0c;企业内部的沟通对企业管理有着非常重要的意义&#xff0c;即时通讯软件已成为企业工作中广泛采用的沟通工具。 然而&#xff0c;随着企业内部敏感信息通过互联网泄露的频繁发生&#xff0c;例如在工作期间&#xff0c;企业员工自发地频繁使…

盘点四款免费在线采购管理系统

今天来盘点五款免费在线采购管理系统。中小型企业在选择采购管理系统时成本是需要考虑的重要因素之一&#xff0c;因此免费在线的采购管理系统是最合适的第一步选择&#xff0c;本文将为您盘点免费在线采购管理系统&#xff1a;1.简道云&#xff1b;2.甄云&#xff1b;3.携客云…