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

2024-09-01 11:52

本文主要是介绍windows C++ 并行编程-C++ AMP 图形(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文中的"显存"还没有找到合适的中文翻译,它的英文名称是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 只能在基础显存数据所在的快捷键视图中进行访问。

这篇关于windows C++ 并行编程-C++ AMP 图形(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126863

相关文章

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

Java之并行流(Parallel Stream)使用详解

《Java之并行流(ParallelStream)使用详解》Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集... 目录Java并行流(Parallel Stream)1. 核心概念与原理2. 创建并行流的方式3. 适

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::