OpenCL编程指南-5.1工作项函数-整数函数-公共函数

news2024/11/21 1:37:02

工作项函数

应用程序使用clEnqueueNDRangeKernelclEnqueueTask API将OpenCL中的数据并行和任务并行内核排队。对于一个数据并行内核(使用clEnqueueNDRangeKernel排队等待执行),应用程序会指定全局工作大小,即可以并行执行这个内核的工作项总数,还会指定局部工作大小,即可以归组到一个工作组中的工作项数目。

如下描述了OpenCL内核可以调用的一些内置函数,以便得到有关工作项和工作组的信息,如工作项的全局ID和局部ID,以及全局工作大小和局部工作大小。

uint get_work_dim()                            返回使用的维度数目。这是clEnqueueNDRangeKernel中指定的work_dim参数值
                                               对于clEnqueueTask,这个函数返回1

size_t get_global_size(uint dimindx)           返回为维度dimindx指定的全局工作项数目。这个值由clEnqueueNDRangeKernel的global_work_size参数给定。
                                               dimindx的合法取值范围为0 ~ get_work_dim() - 1。
                                               对于其他dimindx值,get_global_size()返回1
                                               对于clEnqueueTask,这个函数总是返回1

size_t get_global_id(uint dimindx)             返回维度dimindx的唯一全局工作项ID值。全局工作项ID根据为执行内核指定的全局工作项数目来指定工作项ID。
                                               dimindx的合法取值范围为0 ~ get _work_dim() - 1。
                                               对于其他dimindx值,get_global_id()返回0
                                               对于clEnqueueTask,这个函数总是返回0

size_t get_local_size(uint dimindx)            返回为维度dimindx指定的局部工作项数目。
                                               如果local_work_size不为NULL,则这个值由clEnqueueNDRangeKernel的local_work_size参数给定;
                                               否则,OpenCL实现会选择一个适当的local_work_size值。dimindx的合法取值范围为0 ~ get_work_dim() -1。
                                               对于其他dimindx值,get_local_size()返回1
                                               对于clEnqueueTask,这个函数总是返回1
 
size_t get_local_id(uint dimindx)              返回维度dimindx的唯一局部工作项ID值(即一个特定工作组中的一个工作项)。
                                               dimindx的合法取值范围为0 ~ get_work_dim()-1。
                                               对于其他dimindx值,get_local_id()返回0
                                               对于clEnqueueTask,这个函数总是返回0

size_t get_num_groups(uint dimindx)            返回为维度dimindx指定的将执行内核的工作组数目。
                                               dimindx的合法取值范围为0 ~ get_work_dim()-1。
                                               对于其他dimindx值,get_num_groups()返回1
                                               对于clEnqueueTask,这个函数总是返回1

size_t get_group_id(uint dimindx)              返回工作组 ID,这是介于0 ~ get_num_groups(dimindx)-1之间的一个数。
                                               dimindx的合法取值范围为0 ~ get_work_dim() - 1。
                                               对于其他dimindx值,get_group_id()返回0
                                               对于clEnqueueTask,这个函数总是返回0

size_t get_global_offset(uint dimindx)         返回clEnqueueNDRangeKernel的global_work_offset参数中指定的偏移值,dimindx的合法取值范围为0~get_work_dim()-1。
                                               对于其他dimindx值,get_global_offset()返回0
                                               对于clEnqueueTask,这个函数总是返回0

图5-1给出了一个例子,展示设备上执行的内核可以访问clEnqueueNDRangeKernel中指定的全局工作大小和局部工作大小。在这个例子中,执行内核的全局工作大小为16个工作项,工作组大小为每组8个工作项。
在这里插入图片描述
OpenCL没有描述全局ID和局部ID如何映射到工作项和工作组。例如,一个应用程序不会假设组ID为0的工作组就包含全局ID为0 ~ get_local_size(0)-1的工作项。这个映射由OpenCL实现以及执行内核的设备来确定。

整数函数

ugentype abs(gentype x)                                        返回|x|
ugentype abs_diff(gentype x, gentype y)                        返回|x-y|,无模上溢出
gentype add_sat(gentype x, gentype y)                          返回x+y, 且使结果饱和
gentype hadd(gentype x, gentype y)                             返回(x+y)>>1 中间的和无模上溢出
gentype rhadd(gentype x, gentype y)                            返回(x+y+1)>>1 中间的和无模上溢出

gentype clamp(gentype x, gentype minval, gentype maxval)       返回min(max(x,minval),maxval)
gentype clamp(gentype x, sgentype minval, sgentype maxval)     如果minval>maxval 则结果未定义

gentype clz(gentype x)                                         返回x中前导0的位数,从最高有效位开始
gentype mad_hi(gentype a, gentype b, gentype c)                返回mul_hi(a,b)+c
gentype mad_sat(gentype a, gentype b, gentype c)               返回a*b+c 且使结果饱和

gentype max(gentype x, gentype y)                              如果x<y 返回y 否则返回x
gentype max(gentype x, sgentype y)                             

gentype min(gentype x, gentype y)                              如果x<y 返回y 否则返回x
gentype min(gentype x, gentype y) 

gentype mul_hi(gentype x, gentype y)                           计算x*y 返回y 否则返回x

gentype rotate(gentype v, gentype i)                           对于v中的各个元素,使各位按i中相应元素给定的位数左移。
                                                               元素左边移出的位再从右边移入

gentype sub_sat(gentype x, gentype y)                          返回x-y 并使结果饱和


short upsample(char hi, uchar lo)                              如果hi和lo是标量
ushort upsample(uchar hi, uchar lo)                            result=((short)hi << 8) | lo
shortn upsample(charn hi, ucharn lo)                           result=((ushort)hi << 8) | lo
ushortn upsample(ucharn hi, ucharn lo)

int upsample(short hi, ushort lo)                              result = ((int)hi << 16) | lo
uint upsample(ushort hi, ushort lo)                            result = ((uint)hi << 16) | lo

long upsample(int hi, uint lo)                                 result = ((long)hi << 32) | lo
ulong upsample(uint hi, uint lo)                               result = ((ulong)hi << 32) | lo
longn upsample(intn hi, uintn lo)                              如果hi和lo是标量,则对于矢量的各个元素:
ulongn upsample(uintn hi, uintn lo)                            result[i] = ((short)hi[i] << 8) | lo[i]
                                                               result[i] = ((ushort)hi[i] << 8) | lo[i]
                                                               result[i] = ((int)hi[i] << 16) | lo[i]
                                                               result[i] = ((uint)hi[i] << 16) | lo[i]
                                                               result[i] = ((long)hi[i] << 32) | lo[i]
                                                               result[i] = ((ulong)hi[i] << 32) | lo[i]

gentype mad24(gentype x, gentype y, gentype z)                 使用mul24将两个24位整数值x和y相乘
                                                               并把32位整数结果与32位整数z相加    

gentype mul24(gentype x, gentype y)                            将两个24位整数值x和y相乘。
                                                               尽管×和y是32位整数,但是只使用其低24位完成乘法运算。
                                                               只有当x和y中的值在[-2^23,2^23 -1]范围内(如果x和y是有符号整数)
                                                               或者在[0, 224-1]范围内(如果×和y是无符号整数)时,才使用mu124。
                                                               如果x和y不在这个范围内,乘法结果由具体实现定义
                                                        

使用泛型类型名gentype表示函数,可以取 char、char2、char3、char4、char8、char16、uchar、uchar2、uchar3、 uchar4、uchar8、uchar16、short、short2、short3、short4、short8、short16、ushort、ushort2、ushort3、ushort4、ushort8、ushort16、int、int2、int3、int4、int8、int16、uint、uint2、uint3、uint4、uint8、uint16、long、long2、long3、long4、long8、long16、ulong、ulong2、ulong3、ulong4、ulong8或ulong16作为参数类型。

使用泛型类型名ugentype指示无符号的gentype。例如,如果 gentype是 char4,ugentype就是uchar4。另外使用泛型类型名sgentype指示有符号的gentype。

使用泛型类型名sgentype指示函数可以取一个标量数据类型(即char、uchar、short、ushort、int、uint、long或ulong)作为参数类型。对于取gentype和sgentype参数的内置整数函数,gentype参数必须是sgentype参数的矢量或标量。例如,如果sgentype是uchar,gentype则必须是uchar、uchar2、uchar3、uchar4、uchar8或uchar16。

以下是一些可用的宏名。这些值为常量表达式,适用于#if处理指令。

#define CHAR_BTT    8
#define CHAR__MAX   SCHAR__MAX
#define CHAR_MIN    SCHAR_MIN
#define INT_MAX     2147483647
#define INT_MIN     (-2147483647-1)
#define LONG_MAX    Ox7ffffffffffffffL
#define LONG_MIN    (-0x7fffffffffffffffL-1)
#define SCHAR_MAX   127
#define sCHAR_MIN   (-127 - 1)
#define SHRT_MAX    32767
#define SHRT_MIN    (-32767 - 1)
#define UCHAR__MAX  255
#define USHRT_MAX   65535
#define UINT_MAX    Oxffffffff
#define ULONG_MAX   OxffffffffffffffffUL

公共函数

gentype clamp(gentype x, gentype minval, gentype maxval)            返回fmin(fmax(x,minval),maxval)
gentype clamp(gentypef x, float minval, float maxval)               如果minval>maxval 结果未定义
gentype clamp(gentyped x, double minval, double maxval)

gentype degrees(gentype radians)                                    将弧度转换为度,即(180/p)*radians

gentype max(gentype x, gentype y)                                   如果x<y 则返回y; 否则返回x。
gentypef max(gentypef x, float y)                                   这与fmax类似, 只不过如果x或y为infinite或NaN时返回值未定义
gentyped max(gentyped x, double y)

gentype min(gentype x, gentype y)                                   如果y<x则返回y; 否则,返回x。
gentypef min(gentypef x, float y)                                   这与fmin类似,只不过如果x或y为infinite或NaN时返回值未定义
gentyped min(gentyped x, double y)

gentype mix(gentype x,gentype y.gentype a)                          返回x和y的线性混合,实现为x + (y - x)* a
gentypef mix(gentypef x,float y,gentype a)                          如果a不在此范围内,返回值未定义
gentyped mix(gentyped x, double y,gentype a)                        a必须是范围0.0...1.0中的一个值。

gentype radians(gentype degrees)                                    将degrees转换为弧度,即(p/180)*degrees

gentype step(gentype edge, gentype x)                               如果x<edge返回0.0; 否则返回1.0
gentypef step(float edge, gentypef x)                               step函数可以用于在任意点创建一个不连续的跳步
gentyped step(double edge, gentyped x)

gentype smoothstep(gentype edge0, gentype edgel, gentype x)         如果x≤edge0返回0.0,如果x>=edge1 则返回1.0;
gentypef smoothstep(float edge0, float edgel, gentypef x)           edge0<x<edge1时,在0~1之间完成一个平滑hermite插值。
gentyped smoothstep(double edge0, double edgel, gentyped x)         这在需要一个平滑过渡的阈值函数时很有用
t与x类型相同时,等价于:
                                                                    t = clamp((x-edgeO) / (edgel-edge0),0,1);return t * t * (3 - 2 * t)
                                                                    如果edge0≥ edgel或者x、edge0或edge1 为NaN 时,结果未定义

gentype sign(gentype x)                                             如果x>0,返回1.0
                                                                    如果x=-0.0,返回-0.0;
                                                                    如果x=+0.0,返回+0.0;
                                                                    如果x<0,则返回-1.0;
                                                                    如果x是NaN,则返回0.0

使用泛型类型名gentype指示函数可以取float、float2、float3、float4、float8或float16为参数类型,如果支持双精度扩展,还可以取double、double2、double3、double4、double8或double16作为参数类型。

使用泛型类型名gentypef指示函数可以取float、float2、float3、float4、float8或float16作为参数类型,使用泛型类型名gentyped指示函数可以取double、double2、double3、double4、double8或double16作为参数类型。

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

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

相关文章

PSP - AlphaFold2 中单链 MSA 特征的源码简读

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130752004 AlphaFold2 是基于深度学习的方法,可以根据氨基酸序列,预测蛋白质的三维结构。在 2020 年的 CASP14 竞赛中,展示了惊人的准确性,达到了原子级别…

python读取linux系统的cpu以及内存占用

直接贴代码 import subprocessdef get_system_stats():# 通过 shell 命令获取 CPU 使用率和内存使用率cpu_command "top -bn1 | grep %Cpu(s) | awk {print $2}"memory_command "free | grep Mem | awk {print $3/$2 * 100.0}"# 执行命令并获取输出结果…

鸿蒙Hi3861学习十六-Huawei LiteOS-M(Socket服务端)

一、简介 具体概念可以参考上一章内容&#xff1a;鸿蒙Hi3861学习十五-Huawei LiteOS-M&#xff08;Socket客户端&#xff09;_t_guest的博客-CSDN博客 WIFI学习一&#xff08;socket介绍&#xff09;_wifi socket_t_guest的博客-CSDN博客 二、API介绍 bind 函数功能&#xff1…

pdf怎么转换成jpg图片?转换方式说明

将PDF转换为JPG图片是一种常见的文件格式转换操作&#xff0c;通常用于在不同设备上查看和共享PDF文档。但是&#xff0c;大多数情况下&#xff0c;将PDF转换为JPG图片可能并不总是可行或有效的。在本文中&#xff0c;我们将讨论为什么不能将PDF转换为JPG图片&#xff0c;以及如…

了解设备健康报表的关键指标与分析方法

在现代工业领域中&#xff0c;设备健康报表是一项关键工具&#xff0c;通过收集和分析设备的运行数据&#xff0c;它提供了关于设备状态和性能的重要指标。设备健康报表对于企业的设备管理和维护决策至关重要。本文将介绍设备健康报表的关键指标&#xff0c;并提供解读和分析方…

苹果手机、电脑如何进行屏幕录制?苹果录屏功能在哪?

随着人们生活水平的提高&#xff0c;不少小伙伴都会选择苹果手机、苹果电脑作为主要的设备。因为使用苹果电脑进行办公&#xff0c;不仅仅能够提升效率&#xff0c;对于文件的安全性也是有一些保障的。那么&#xff0c;在使用苹果电脑的时候&#xff0c;如果需要有录屏的需求该…

【JAVA】this关键字和static关键字

目录 1.this关键字 2.static关键字 容易混淆的问题 1.this关键字 一个对象一个this。this是一个变量&#xff0c;是一个关键字&#xff0c;是一个引用。this保存当前对象的内存地址&#xff0c;指向自身。所以&#xff0c;严格意义上来说&#xff0c;this代表的就是“当前对象…

Avada学习之-如何加入谷歌地图

如何正确设置谷歌地图 在给Wordpress网站配置谷歌地图时&#xff0c;常常会出现谷歌地图无法显示的问题。具体提示为Oops! something went wrong&#xff0c;如下图。出现这种问题有如下原因。 内容 隐藏 一、地址不正确 二、API 没填 三、插件冲突 一、地址不正确 很多…

iOS正确获取图片参数深入探究及CGImageRef的使用

一 图片参数的正确获取 先拿一张图片作为测试使用 图片参数如下&#xff1a; 图片的尺寸为&#xff1a; -宽1236个像素点 -高748个像素点 -色彩空间为RGB -描述文件为彩色LCD -带有Alpha通道 请记住这几个参数&#xff0c;待会儿我们演示如何正确获取。 将这张图片分别放在…

光纤衰减器作用及使用说明

在光纤通信中&#xff0c;光信号的强度过大或过小都会对信号的传输和接收产生不良的影响&#xff0c;因此光衰减器在光通信系统中起到了重要的作用。那什么是光衰减器呢&#xff1f;它又有什么作用呢&#xff1f;下面跟着小易一起来了解一下吧&#xff01; 一、什么是光纤衰减…

APP自动化测试工具的作用和特点

随着移动应用的迅速发展&#xff0c;APP的自动化测试工具变得越来越重要。APP自动化测试工具可以帮助开发者在应用程序的不同平台上执行测试&#xff0c;从而检测和确保应用程序的完整性、稳定性和可靠性。下面将介绍APP自动化测试工具的作用和特点。 一、作用 提高测试效率&am…

Android自定义控件——控件的测量和绘制

控件的测量和绘制 控件架构setContentView()MeasureSpecViewView的测量View的绘制 ViewGroupViewGroup的测量ViewGroup的绘制 自定义View对现有控件进行扩展案例一&#xff1a;添加背景案例二&#xff1a;文字闪动 创建复合控件重写View实现全新控件案例一&#xff1a;弧线展示…

FLEXPART--空气块轨迹-扩散模式

模式简介&#xff1a; FLEXPART(Flexible Particle Dispersion Model)模式是由挪威大气研究所(Norwegian Institute for Air Research)和德国慕尼黑工业大学(Technical University of Munich)联合开发的空气块轨迹&#xff0d;扩散模式, 其通过计算区域内所有气块的运动轨迹进…

PLE - 多任务模型(腾讯)

文章目录 1、动机2、模型结构3、代码实现细节&#xff1a; Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations论文发表在 RecSys-2020&#xff0c; best paper。ple主要缓解了mtl里两大问题&#xff1a;负迁移…

如何在海量、庞杂、混合的数据中发现价值?

数字时代&#xff0c;数据上升为国家战略&#xff0c;数据成为重要的生产要素和资产&#xff0c;得到了越来越多企业的重视&#xff0c;也成为企业数字化转型的重要抓手。据IDC中国预测&#xff0c;2025年中国大数据生产量有望增长至48.6ZB。 随着越来越大的数据量&#xff0c…

【C++从0到王者】第六站:类和对象(下)

文章目录 一、再谈构造函数1.构造函数体赋值2.初始化列表1>初始化列表的使用2>初始化列表的注意事项 3.explicit关键词 二、static成员1.如何统计当前程序中变量的个数2.static的特性3.从1加到n4.设计一个类&#xff0c;只能在栈或者堆上开辟空间 三、友元1.友元函数2.友…

一个简化、落地的实时数据仓库解决方案

从传统的经验来讲&#xff0c;数据仓库有一个很重要的功能是记录数据变化历史。通常&#xff0c;数据仓库都希望从业务上线的第一天开始有数据&#xff0c;然后一直记录到现在。但实时处理技术&#xff0c;又是强调当前处理状态的一门技术&#xff0c;所以当这两个相互对立的方…

聚合数据证件识别接口-基于PHP示例代码

1、开通接口 以下代码示例基于聚合数据提供的证件识别接口&#xff0c;使用前需要先注册申请本接口&#xff0c;获得请求密钥key。 接口文档地址&#xff1a;https://www.juhe.cn/docs/api/id/153 2、功能介绍 通过自动识别的方式获取常规证件文字内容&#xff0c;免去用户…

react函数式组件转化为string---renderToString

需求 使用aggrid的过程中&#xff0c;某个自定义的图标需要传dom的字符串。 但在react的开发中&#xff0c;一般都是组件的概念&#xff08;ReactNode&#xff0c;JSX.Element&#xff09; 因此需要一个方法将dom组件转化为字符串 收获 找到了官网的API——renderToString 作…

虚拟主机部署ssl证书(https)流程

注意事项&#xff1a; 1、域名要做别名解析指向二级域名 2、证书已经申请完成&#xff0c;其他公司的证书要下载导入到西部数码。 虚拟主机部署教程如下&#xff1a; 部署证书 首先要将域名绑定到主机上&#xff0c;在主机控制面板找到【SSL部署】按钮。 在西部数码申请过证…