OpenCL编程指南-5.5图像读、写函数

news2024/10/6 20:26:25

读图像

OpenCL GPU设备有专用硬件来读、写图像。OpenCL C图像读、写函数允许开发人员充分利用这个专用硬件。OpenCL 中的图像支持是可选的。要了解一个设备是否支持图像,可以使用clGetDeviceInfo API查询CL_DEVICE_IMAGE_SUPPORT属性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
需要说明的是,read_imagef、read _imagei和read_imageui分别返回一个float4、int4或uint4颜色值。这是因为颜色值最多有4个分量。表5-18列出了图像中缺失分量所用的值。
在这里插入图片描述

采样器

图像读函数取一个采样器参数。采样器指定了如何从图像采样像素。可以使用clsetKernelArg API把采样器作为参数传递到一个内核,或者采样器可以是程序源代码中声明的一个类型为sampler_t的恒定变量。

作为参数传递或者在程序源代码中声明的采样器变量都必须是 sampler_t类型。sampler_t类型是一个32位无符号整数常量,可以解释为一个位域。采样器描述了以下信息:
1)规格化坐标:指定coord. xy或coord. xyz值是规格化还是非规格化值,可以设置为CLK_NORMALIZED_COORDS_TRUE或CLK_NORMALIZED_COORDS_FALSE。
2)寻址模式:指定coord.xy或coord.xyz图像坐标如何映射到图像中适当的像素位置,越界的图像坐标如何处理。表5-19描述了目前支持的寻址模式。
3)过滤模式:指定使用的过滤模式,可以设置为CLK_FILTER_NEAREST(即最近过滤器)或CLK_FILTER_LINEAR(即双线性过滤器)。
在这里插入图片描述
下面的例子中,采样器作为参数传递到一个内核

kernel void
my_kernel(read_only image2d_t imgA, sampler_t sampler, write_only image2d imgB)
{
      int2 coord = (int2)(get_global_id(0), get_global_id(1));
      float4 clr = read_imagef(imgA, sampler, coord);
      write_imagef(imagB, coord, color);
}

下面的例子中,采样器在程序源代码中声明:

const sampler_t samplerA = CLK_NORMALIZED_COORDS_FALSE |
                           CLK_ADDRESS_CLAMP |
                           CLK_FILTER_LINEAR;

kernel void
my_kernel(read_only image2d_t imgA, read_only image2d_t imgB, write_only image2d imgB)
{
      int2 coord = (int2)(get_global_id(0), get_global_id(1));
      float4 clr = read_imagef(imgA, samplerA, coord);
      clr *= read_imagef(imgA,
                          (CLK_NORMALIZED_COORDS_FALSE |
                           CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST),
                           imgB);
}

内核中可以使用的最大采样器数目可以通过使用clGetDeviceInfo API查询CL_DEVICE_MAX_SAMPLERS属性来得到。

限制
从相同图像读取时,为read_imagef、read_imagei或read_imageui 指定的采样器必须使用相同的规格化坐标值。下面的例子可以说明这一点(这里突出显示了采样器使用了不同的规格化坐标值)。这会导致未定义的行为,也就是说,返回的颜色可能不正确。

const sampler_t samplerA = CLK_NORMALIZED_COORDS_FALSE |
                           CLK_ADDRESS_CLAMP |
                           CLK_FILTER_LINEAR;

kernel void
my_kernel(read_only image2d_t imgA, write_only image2d imgB)
{
    float4 clr;
    int2 coord = (int2)(get_global_id(0), get_global_id(1));
    float2 normalized_coords;
    float w = get_image_width(imgA);
    float h = get_image_height(imgA);
    
    clr = read_imagef(imgA, samplerA, coord);
    normalized_coords = convert_float2(coord) * (float2)(1.0f / w, 1.0f / h);
    clr *= read_imagef(imgA,
                          (CLK_NORMALIZED_COORDS_FALSE |
                           CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST),
                           normalized_coords);
}

另外,采样器不能声明为数组或指针,也不能作为函数中的局部变量或程序中定义的函数的返回值。函数的采样器参数不能修改。下面的例子给出了一些非法使用采样器的情况,这些会导致一个编译时错误:

sampler_t <- error. return type cannot be sampler_t
internal_proc(read_only image2d_t imgA, write_only image2d imgB)
{
    ...
}

kernel void
my_kernel(read_only image2d_t imgA, sampler_t sampler, write_only image2d imgB)
{
     sampler_t *ptr_sampler; <- error. pointer to sampler not allowed
     my_func(imgA, &sampler); <- error. passing a pointer to a sampler
     ...
}

确定边界颜色

如果采样器寻址模式为CLK_ADDRESs_CLAMP,则越界的图像坐标会返回边界颜色。返回的边界颜色取决于图像通道次序,见表5-20。
在这里插入图片描述

写图像

表5-21和表5-22分别描述了写2D图像和3D图像的内置函数。
在这里插入图片描述
在这里插入图片描述
如果×坐标不在范围(0 …图像宽度–1)内,或者y坐标不在范围(0 …图像高度-1)内,对2D图像的write_imagef、write_imagei或write_imageui行为未定义。

如果×坐标不在范围(0 …图像宽度–1)内,或者y坐标不在范围(0 …图像高度-1)内,或者z坐标不在范围(0 …图像深度–1)内,对3D图像的write_imagef、write_imagei或write_imageui行为未定义。

查询图像信息

表5-23描述了图像查询函数。get_image_channel_data_type和get_image_channelorder返回的值使用了一个CLK_前缀。有 CLK_前缀的值与clcreateImage2D和clCreateImage3D的cl_image_format参数中image_channel_order和image_channel_data_type域指定的相应CL_前缀存在一一映射。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

c4d+AI+PS设计广告展示架/销售柜台/展示盒子的建议

1、首先做出我标识出来的样子&#xff0c;这里称作A面。&#xff08;可用软件&#xff1a;PS、AI、cdr等&#xff09; 2、制作用于展示盒A面PNG图片&#xff08;PS来掏空空白处用于描边&#xff09;。 操作&#xff1a;按需求缩小图片&#xff0c;载入选区&#xff0c;新建图层…

three.js标准网格材质(MeshStandardMaterial)光照、粗糙度、金属度、法线属性介绍

如上图&#xff0c;在前面的章节中我们通过设置物体的纹理和材质实现了一个3d的立体门框的效果 完整代码如下&#xff1a; import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls&quo…

新媒体运营工作总结

新媒体运营工作总结篇1 一、大力提升新媒体平台的关注度。在当前掩盖全校60%的同学的基础上&#xff0c;进一步提高掩盖率&#xff0c;争取在未来一年中到达90%以上。为了增强平台与受众的互动与交流&#xff0c;吸引同学们的关注&#xff0c;可以展开更多同学们喜闻乐见的线上…

macOS FreeBSD 如何刷新 DNS 缓存

macOS FreeBSD 如何刷新 DNS 缓存 全文&#xff1a;如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, Debian, Ubuntu, Windows) 请访问原文链接&#xff1a;https://sysin.org/blog/how-to-flush-dns-cach…

(动态规划) 5. 最长回文子串 ——【Leetcode每日一题】

❓ 5. 最长回文子串 难度&#xff1a;中等 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a…

Pytest+Webdriver+Alluer的UI自动化测试框架

作为web自动化的入门学习&#xff0c;搭建框架练习下 一、熟悉项目的测试框架的整体目录 二、 PIP安装完所需框架 1、编写main.py import pytestif __name__ __main__:#pytest.main() # 遍历相同目录下的所以test开头的用例#生成测试报告 #一次执行所有接口测试用例&…

【消费战略方法论】3W消费战略作业方法

3W消费战略 以消费者为核心导向的 品牌战略 品牌本质上属于消费者&#xff0c;消费者是品牌战略的核心。所有品牌工作都应把握一个标准&#xff0c;即是否围绕着消费者&#xff0c;是否对消费者有价值。一切的品牌战略、策略、创意、营销等工作都应该是为了“消费者”而设…

【Java|多线程与高并发】定时器(Timer)详解

文章目录 1. 前言2. 定时器的基本使用3. 实现定时器4. 优化上述的定时器代码5. 总结 1. 前言 在Java中&#xff0c;定时器Timer类是用于执行定时任务的工具类。它允许你安排一个任务在未来的某个时间点执行&#xff0c;或者以固定的时间间隔重复执行。 在服务器开发中,客户端向…

原型模式(Prototype)

定义 原型是一种创建型设计模式&#xff0c;使你能够复制已有对象&#xff0c;而又无需使代码依赖它们所属的类。 别名 克隆&#xff08;Clone&#xff09;。 前言 1. 问题 如果你有一个对象&#xff0c;并希望生成与其完全相同的一个复制品&#xff0c;你该如何实现呢&a…

基于工业智能网关的设备运维管理平台有何功能?

工业物联网平台作为监控工业设备和工业环境的智能应用&#xff0c;整合边缘和云端的数据优势&#xff0c;在制造业领域得到越来越丰富的应用。 在工业制造生产过程中&#xff0c;常常分为人、机、料、法、环等五大要素&#xff0c;其中机器设备的安全稳定运行时保证工厂生产效…

58同城AI Lab在WeNet中开源GPU热词增强功能

01 前言 端到端语音识别系统在足够多数据上训练后&#xff0c;往往能达到不错的识别效果&#xff0c;然而在实际应用场景中&#xff0c;对于不常见的专有名词&#xff0c;例如人名、产品名、小区名等&#xff0c;往往容易识别错误&#xff0c;此类问题需要快速修复&#xff0c…

DNS是什么?DNS的工作流程

79. DNS是什么&#xff1f; DNS&#xff08;Domain Name System&#xff09;是一种用于将域名解析为相应IP地址的分布式命名系统&#xff0c;了解DNS对于理解域名解析原理和优化网络请求非常重要。本篇文章将介绍DNS的概念、工作原理以及在前端开发中的应用&#xff0c;帮助前…

正则表达式-捕获组,命名捕获组,非捕获组

正则表达式的作用 测试目标字符串是否符合规则 返回true/false按照规则从目标字符串提取内容 返回匹配的数组 在线测试工具 regex101: build, test, and debug regexRegular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, …

java适配达梦数据库

目录 一、数据库安装 二、数据库可视化工具 三、数据迁移 四、工程适配 新增maven依赖 配置文件修改 基于flyway的数据库版本管理 五、注意事项 一、数据库安装 官方文档&#xff1a;安装前准备 | 达梦技术文档 这里有一个点需要注意&#xff0c;如果你之前的数据库或…

【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

Java高级语法详解之方法引用 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法形式3.2 案例 4️⃣ 应用场景5️⃣ 注意事项&#x1f33e; 总结 1️⃣ 概念 方法引用是Java编程语言中的一个重要特性&#xff0c;它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambd…

【博客675】prometheus生产上易犯的错误

prometheus生产上易犯的错误 Mistake 1: Cardinality bombs 这是每个人在开始使用 Prometheus 时至少会遇到一次的经典陷阱。一旦您发现 Prometheus 基于标签的数据模型的有用性&#xff0c;您可能会想按各种有用的标签维度来拆分指标&#xff0c;直到您创建的时间序列超出 P…

【QT】枚举用到的宏详解:Q_ENUM,Q_FLAG,Q_DECLARE_FLAGS,Q_DECLARE_OPERATORS_FOR_FLAGS

目录 1. Q_ENUM宏 与 QMetaEnum类1.1 Q_ENUM宏的作用1.2 使用Q_ENUM注意的问题1.3 在写有关枚举的代码时&#xff0c;我们可能遇到这种情况&#xff1a;需要用到枚举的字符串&#xff0c;该怎么办&#xff1f;1.4 下面通过一段简单的代码来说明Q_ENUM的作用 2. Q_FLAG宏2.1 Q_F…

【SpringMVC】| 拦截器(含源码分析)

目录 拦截器 1. 拦截器的介绍 2. 拦截器的三个抽象方法 3. 拦截器的使用 4. 多个拦截器的执行顺序 Java核心技术大会 文末福利&#xff08;Java核心技术卷&#xff09; 拦截器 拦截器能拦截请求&#xff0c;前面学习的过滤器也能拦截请求&#xff0c;那两者有什么区别…

【数据结构与算法C++实现】1、异或的用法

原视频为左程云的B站教学 文章目录 1 异或换值2 求出数组中唯一一个出现奇数次的数3 求出数组中的两个出现奇数次的数 异或&#xff1a; 相同为0&#xff0c;不同为1。 更好的记忆方式&#xff1a; 不进位相加 10010 ^ 01100--------11110性质 0 ^ N N&#xff0c;N ^ N 0…

广电用户画像分析之根据用户行为数据进行筛选与标签添加

在数据处理和分析领域&#xff0c;我们经常需要根据用户的行为数据进行筛选和标签添加&#xff0c;以便更好地理解用户行为和偏好。在本篇博客中&#xff0c;我们将介绍两个示例&#xff0c;展示如何根据用户的收视行为数据和订单信息进行数据处理和分析。 前情提要&#xff1…