windows C++ 并行编程-C++ AMP 图形(二)

news2024/9/24 9:20:56

文中的"显存"还没有找到合适的中文翻译,它的英文名称是texture, 在应用开发者来看,texture是一个名词,在物理上指的是 GPU显存中一段连续的空间。

读取显存对象

可以使用 texture::operator[]、texture::operator() 运算符或 texture::get 方法从 texture 对象中读取。 两个运算符将返回一个值,而不是引用。 因此,你不能使用 texture 写入 texture::operator\[\] 对象。

void readTexture() {
    std::vector<int_2> src;
    for (int i = 0; i <16 *32; i++) {
        int_2 i2(i, i);

        src.push_back(i2);
    }

    std::vector<int_2> dst(16* 32);

    array_view<int_2, 2> arr(16, 32, dst);

    arr.discard_data();

    const texture<int_2, 2> tex9(16, 32, src.begin(), src.end());

    parallel_for_each(tex9.extent, [=, &tex9] (index<2> idx) restrict(amp) { // Use the subscript operator.
        arr[idx].x += tex9[idx].x; // Use the function () operator.
        arr[idx].x += tex9(idx).x; // Use the get method.
        arr[idx].y += tex9.get(idx).y; // Use the function () operator.
        arr[idx].y += tex9(idx[0], idx[1]).y;
    });

    arr.synchronize();
}

 下面的代码示例演示如何在短矢量中存储显存通道,然后访问作为短矢量属性的各个标量元素。

void UseBitsPerScalarElement() { // Create the image data. // Each unsigned int (32-bit) represents four 8-bit scalar elements(r,g,b,a values).
    const int image_height = 16;
    const int image_width = 16;
    std::vector<unsigned int> image(image_height* image_width);

    extent<2> image_extent(image_height, image_width);

    // By using uint_4 and 8 bits per channel, each 8-bit channel in the data source is // stored in one 32-bit component of a uint_4.
    texture<uint_4, 2> image_texture(image_extent, image.data(), image_extent.size()* 4U,  8U);

    // Use can access the RGBA values of the source data by using swizzling expressions of the uint_4.
    parallel_for_each(image_extent,
        [&image_texture](index<2> idx) restrict(amp)
        { // 4 bytes are automatically extracted when reading.
            uint_4 color = image_texture[idx];
            unsigned int r = color.r;
            unsigned int g = color.g;
            unsigned int b = color.b;
            unsigned int a = color.a;
        });
}

 下表列出了每种短矢量类型的每通道有效位数。

 写入显存对象

使用 texture::set 方法可写入 texture 对象。 显存对象可以是只读或读/写属性。 显存对象若要可读写,必须满足以下条件:

T 只有一个标量组件。 (不允许使用短矢量。)

T 不是 double、norm 或 unorm。

texture::bits_per_scalar_element 属性为 32。

如果不符合这三个条件,则 texture 对象为只读对象。 编译期间将检查前两个条件。 如果有代码尝试写入 readonly 显存对象,将产生编译错误。 texture::bits_per_scalar_element 条件在运行时进行检查,如果尝试写入只读的 texture 对象,则运行时将产生 unsupported_feature 异常。

下面的代码示例向一个显存对象写入了多个值。

void writeTexture() {
    texture<int, 1> tex1(16);

    parallel_for_each(tex1.extent, [&tex1] (index<1> idx) restrict(amp) {
        tex1.set(idx, 0);
    });
}
 复制显存对象

如下面的代码示例所示,可以使用 copy 函数或 copy_async 函数在显存对象之间进行复制。

void copyHostArrayToTexture() { // Copy from source array to texture object by using the copy function.
    float floatSource[1024* 2];
    for (int i = 0; i <1024* 2; i++) {
        floatSource[i] = (float)i;
    }
    texture<float_2, 1> floatTexture(1024);

    copy(floatSource, (unsigned int)sizeof(floatSource), floatTexture);

    // Copy from source array to texture object by using the copy function.
    char charSource[16* 16];
    for (int i = 0; i <16* 16; i++) {
        charSource[i] = (char)i;
    }
    texture<int, 2> charTexture(16, 16, 8U);

    copy(charSource, (unsigned int)sizeof(charSource), charTexture);
    // Copy from texture object to source array by using the copy function.
    copy(charTexture, charSource, (unsigned int)sizeof(charSource));
}

你还可以使用 texture::copy_to 方法从一个纹理复制到另一个纹理。 这两个纹理可以位于不同的 accelerator_view 上。 当复制到 writeonly_texture_view 对象时,数据将复制到基础 texture 对象。 源和目标 texture 对象上的每标量元素位数和范围必须相同。 如果不符合这些需求,运行时将引发异常。

显存视图类

C++ AMP 介绍了 Visual Studio 2013 中的 texture_view 类。 显存视图支持与 texture 类相同的纹素类型和秩,但是与显存不同,它们允许访问其他硬件功能,如显存采样和 mipmap。 显存视图支持对基础显存数据进行只读、只写和读/写访问。

  • 只读访问由 texture_view<const T, N> 模板专用化提供,支持具有 1 个、2 个或 4 个组件的元素、显存采样以及动态访问在实例化视图时确定的一系列 mipmap 级别;
  • 写入访问由非专用模板类 texture_view<T, N> 提供,支持具有 2 个或 4 个组件的元素,并且可以访问在实例化视图时确定的一个 mipmap 级别。 它不支持采样;
  • 读写访问由非专用模板类 texture_view<T, N> 提供,与显存一样,支持仅具有 1 个组件的元素;视图可以访问在实例化视图时确定的一个 mipmap 级别。 它不支持采样;

显存视图类似于数组视图,但是不提供 array_view 类通过 array 类提供的自动数据管理和移动功能。 texture_view 只能在基础显存数据所在的快捷键视图中进行访问。

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

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

相关文章

物流需求回复势头稳定,目前全国社会物流总额达197.7万亿元

中国物流与采购联合会29日公布今年1-7月份物流运行数据。数据显示&#xff0c;物流需求恢复势头基本稳定&#xff0c;7月份虽受部分地区高温多雨等短期因素扰动&#xff0c;但物流总额增速环比有所提升&#xff0c;呈现温和回升态势。 今年1-7月份&#xff0c;全国社会物流总额…

数据仓库系列17:元数据管理在数据仓库中的作用是什么?

想象一下,你正在管理一个巨大的图书馆,里面存放着数以万计的书籍。但是,这个图书馆没有任何目录、索引或分类系统。你能想象找到特定的一本书会有多困难吗?这就是没有元数据管理的数据仓库的真实写照。 目录 什么是元数据?元数据管理的重要性元数据在数据仓库中的类型1. 技术…

Open3D mesh Taubin滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 参数详解 返回值 2.2完整代码 三、实现效果 3.1加入噪声的mesh 3.2Taubin迭代10次 3.3Taubin迭代100次 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云…

【学习笔记】卫星通信发展趋势

卫星通信系统是融合现代通信技术、航天技术与计算机技术的综合应用&#xff0c;已成为国际与国内通信、国防、移动通信及广播电视领域的关键基础设施。基于其频带宽度大、通信容量高、业务兼容性强、覆盖范围广、性能稳定、地理条件适应性高及成本与距离无关等特性&#xff0c;…

猫咪浮毛不再乱飞 希喂、霍尼韦尔、352宠物空气净化器功能实测

“你真的养猫了吗&#xff1f;为什么一点也看不出来&#xff1f;”养宠以来我经常收到这样的提问&#xff0c;原因是另一位铲屎官身上总会时不时出现猫咪毛发&#xff0c;标记着他的身份。哪有不会掉毛的猫咪呢&#xff0c;何况到了夏天&#xff0c;换毛季的掉毛量更是惊人。其…

KTV开台源码--SAAS本地化及未来之窗行业应用跨平台架构

一、ktv开台源码 function 未来之窗_人工智能_KTV开台(title,桌台id,类型id,类型名称){var 未来之窗app_通用ID"未来之城激光加工机";var 未来之窗_人工智能_内容 tpl_未来之窗_模板_KTV开单;CyberWin_Dialog.layer(未来之窗_人工智能_内容,{type:"frame",…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用&#xff0c;流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量&#xff0c;Kubernetes 提供了多种解决方案&#xff0c;其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

【手撕数据结构】二叉树的性质

目录 叶子节点和边的性质概念小试牛刀 叶子节点和边的性质 概念 可以看到度为0的节点如F没有边&#xff0c;度为1的节点如C有一条边&#xff0c;而度为2的节点如B有两条边。那么设度为2的节点为a个&#xff0c;度为1的节点为b个。二叉树边 2ab另⼀⽅⾯&#xff0c;由于共有 a…

反激式开关电源(硬件面试86题 电源专栏)

在硬件面试经典中的第 86 题中提到的反激式开关电源&#xff0c;是通过开关通断将交流转变成直流的 AD-DC 开关电源的一种&#xff0c;并且反激式开关电源是由 BUCK-BOOST 电路演变而来&#xff0c;所以博客由浅入深一步一步讲解完反激式开关的知识&#xff0c;让我们开始吧&am…

未使用CMSIS之前的stm32标准库中SystemHandler的宏定义

背景&#xff1a; 在stm32的标准库还叫STM32F10xxx_FWLib_V2.0.3的那个年代 文件 STM32F10xFWLib_V2.0.3/FWLib/library/inc/stm32f10x_nvic.h 中有对System Handlers的定义。具体内容如下&#xff1a; /* System Handlers -------------------------------------------------…

【Python】2.基础语法(2)

文章目录 1.顺序语句2.条件语句2.1语法格式2.1.1 if2.1.2 if - else2.1.3 if - elif - else 2.2缩进和代码块2.3 空语句 pass 3. 循环语句3.1 while 循环3.2 for 循环3.3 continue3.4 break 4. 综合案例4.1 设置初始属性4.2 设置性别4.3 设置出生点4.4 针对每一岁, 生成人生经历…

【MySQL】主键优化原理篇——【数据组织方式&主键顺序插入&主键乱序插入&页分裂&页分裂】

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

AI搜索:重塑信息获取的新纪元

在信息爆炸的时代&#xff0c;如何快速、准确地获取所需信息成为了每个人面临的挑战。传统的搜索引擎虽然在一定程度上解决了这一问题&#xff0c;但广告干扰、结果冗余、内容质量参差不齐等问题仍让用户体验大打折扣。随着AI技术的不断发展&#xff0c;AI搜索产品以其独特的优…

【软件测试】bug以及测试用例的设计方法

系列文章目录 第一章 【软件测试】常见的开发模型和测试模型 文章目录 系列文章目录前言一、bug的基本要素。二、bug的处理流程三、弱网测试四、设计方法1.基于需求的设计方法2.具体的测试方法&#xff08;1&#xff09;等价类划分法&#xff08;2&#xff09;边界值分析法&am…

Serilog文档翻译系列(三) - 基础配置

Serilog 使用简单的 C# API 来配置日志记录。当需要外部配置时&#xff0c;可以&#xff08;慎用&#xff09;通过使用 Serilog.Settings.AppSettings 包或 Serilog.Settings.Configuration 包进行混合配置。 创建日志记录器 日志记录器是通过 LoggerConfiguration 对象创建的…

STM32硬件篇:W25Q64

W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单&#xff08;使用SPI通信协议&#xff09;的非易失性&#xff08;掉电不丢失&#xff09;存储器&#xff0c;常用于数据存储、字库存储、固件程序存储等场景。 【注意】W25Qxx芯片只支持SPI的模式0和模式3。 存储介质&am…

【单片机开发】IAP技术详解及应用

【前言】 在单片机开发过程中&#xff0c;程序的烧录是一个至关重要的环节。随着技术的不断演进&#xff0c;单片机烧录方式也日益多样化。 【单片机开发】单片机的烧录方式详解&#xff08;ICP、IAP、ISP&#xff09;-CSDN博客文章浏览阅读775次&#xff0c;点赞14次&#x…

kali系统学习笔记1

收集DSN相关信息命令 1、ping IP/URL 例如 ping 153.3.238.110 ping www.baidu.com2、nslookup 域名 例如 nslookup www.baidu.com3、dig URL //查询域名正向解析 dig www.baidu.com //查询域名所有解析&#xff08;正向、反向&#xff09; dig www.baidu.com any//通过指…

江协科技stm32————11-1SPI通信协议

目录 SPI通信 硬件电路 移位示意图 SPI时序基本单元 模式0 模式1 SPI时序 发送指令 指定地址写 指定地址读 SPI通信 四根通信线&#xff1a; SCK&#xff08;Serial Clock&#xff09;&#xff1a;串行时钟线 MOSI&#xff08;Master Output Slave Input&#xff09…

书生大模型实战营闯关记录----第十一关:LMDeploy 量化部署进阶实践 KV cache量化部署,W4A16 模型量化和部署

文章目录 1 配置LMDeploy环境1.1 环境搭建1.2 InternStudio环境获取模型1.3 LMDeploy验证启动模型文件 2 LMDeploy与InternLM2.5 2.1 LMDeploy API部署InternLM2.52.1.1 启动API服务器 2.1.2 以命令行形式连接API服务器 2.1.3 以Gradio**网页形式连接API服务器** 2.2 LMDeploy…