cuda三维纹理内存的使用

2023-11-11

有时候需要使用cuda处理多帧的图像,需要把多帧时间序列的图像传入到显存中,这个时候就可以把保存图像的全局内存绑定到二维纹理内存,核函数通过纹理拾取来访问输入的图像数据。不过二维纹理内存的宽是有限制的:

  cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
  cudaMallocArray((cudaArray**)&arr_mat_x, &channelDesc, img_size, IIR_N_X); 

在以上定义二维cuda数组的代码中,img_size是有限制的,如果超过64K就会出错。所以如果每帧图像的大小超过了64K,则不能使用二维纹理内存,这时候可以使用三维纹理内存。下面将详细说明三维纹理内存的使用。

  1. 定义三维cuda数组:
  cudaArray *arr_mat_x;   //定义device端指针
  cudaExtent extent;   //定义图像的尺寸和帧数结构体
  cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<uchar>();  //定义数据类型
  extent.width = col;    //创建extent时,在旧版本中宽度w以字节为单位,即必须乘上sizeof(DTYPE),新版本已经不用乘以sizeof(DTYPE),否则反而会出错!文档和函数说明都没有改过来,这里是坑!
  extent.height = row;   //每帧图像的行数
  extent.depth = picnum;   //图像的总帧数
  cudaMalloc3DArray((cudaArray**)&arr_mat_x, &channelDesc, extent);   //创建picnum帧row*col的存储空间
  1. 将数据从CPU拷贝到cuda数组中:
    cudaMemcpy3DParms HostToDev = {0};   //定义数据传输的结构体
    HostToDev.dstArray = arr_mat_x;    //指定数据传输的目标地址为cuda数组
    HostToDev.extent = make_cudaExtent(col, row, 1);      //创建extent时,在旧版本中宽度w以字节为单位,即必须乘上sizeof(DTYPE),新版本已经不用乘以sizeof(DTYPE),否则反而会出错!文档和函数说明都没有改过来,这里是坑!  
	HostToDev.kind = cudaMemcpyHostToDevice;  //定义传输方向为CPU到GPU显存
	HostToDev.srcPos = make_cudaPos(0, 0, 0);   //定义数据传输的源地址的偏移量
	for(int i = begin; i < begin+picnum; i++)   //拷贝多帧图像到cuda数组
	{
		HostToDev.srcPtr = make_cudaPitchedPtr((void *)pic[i].data, col*sizeof(uchar), col, row);     //指定数据传输的源地址,注意这里的第二个参数需要乘以数据类型所占的字节数   
		HostToDev.dstPos = make_cudaPos(0, 0, i-begin);   //指定目标地址的偏移量,分别为x,y,z地址
		cudaMemcpy3D(&HostToDev);     //根据以上设置的参数实行拷贝
	}
  1. 绑定纹理内存
    texture<uchar, cudaTextureType3D, cudaReadModeElementType>  tex_mat;    //定义为3D类型的纹理内存
	
	tex_mat.normalized = 0;   //不归一化
    tex_mat.filterMode = cudaFilterModePoint;    //filterMode:滤波模式。仅对绑定 CUDA 数组的纹理有效。当使用浮点型的坐标寻址纹理时,将根据设定返回不同类型的值。设定可以有:cudaFilterModePoint 和 cudaFilterModeLinear。分别表示最近邻插值和线性插值
    tex_mat.addressMode[0] = cudaAddressModeClamp;  //寻址模式,即如何处理越界的纹理坐标。可设置:cudaAddressModeClamp 和 cudaAddressModeWrap。Clamp 即钳位模式,Wrap 为循环模式。循环模式只支持归一化的纹理坐标
    tex_mat.addressMode[1] = cudaAddressModeClamp;
    tex_mat.addressMode[2] = cudaAddressModeClamp;
    tex_mat.channelDesc = channelDesc;   //描述纹理返回值类型,同cuda数组部分的内容
	cudaBindTextureToArray(tex_mat, (cudaArray *)arr_mat_x, channelDesc);   //绑定纹理内存
  1. 纹理拾取:
tex3D(tex_mat, (float)(j-1), (float)(i-1), (float)k); //后面三个参数分别是x,y,z坐标
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cuda三维纹理内存的使用 的相关文章

  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • logback使用

    1 需要引入maven配置 ch qos logback logback classic 1 0 0 这个会依赖slf4j api和logback core ch qos logback logback access 1 1 5 所有的ja
  • OpenVSwitch数据面流表cache机制浅谈

    稍许笔墨写了一篇关于OpenVSwitch 以下简称OVS 的文章 https blog csdn net dog250 article details 103492099 但有些事情并没有说清楚 关于OVS的流表是如何映射成数据平面的Fl
  • MATLAB学习之旅(三)精通VC与Matlab联合编程

    Matlab C C 函数库是Matlab扩展功能重要的组成部分 包含了大量的用C C 语言重新编写的Matlab函数 主要包括初等数学函数 线形代数函数 矩阵操作函数 数值计算函数 特殊数学函数 多项式函数 插值函数等 用户可以在自己的C
  • Python自学教程

    本文目录 什么是Python Python的用途是什么 如何安装Python 为什么选择Python R与Python 学习Python的最佳方法 什么是顶级Python IDE 哪个是最适合Python的IDE 1 什么是Python P
  • python中_、__和__xx__的区别

    0 前言 python灵活的语法 给我们带了一些便利 同时也给我们带了一些困惑 其中就是我们常见的 和 xx 的作用和区别 这节我们就来看一下 1 理论 Python中不存在真正的私有方法 为了实现类似于c 中私有方法 可以在类的方法或属性
  • C++ 编程规范-不能被拷贝构造和拷贝赋值的类对象

    不能被拷贝构造和拷贝赋值的类对象 A aobj1 A aobj2 aobj1 拷贝构造 产生新的对象 A aobj3 aobj3 aobj2 赋值构造 不产生新的对象 如果想不能被拷贝构造 且 不能被拷贝赋值 采用delete class
  • 顺序式线性表(c语言)

    include
  • matlab模拟超声波信号_【超声波测距 教程连载】第三章 Matlab波形采集

    本帖最后由 linccfzu 于 2020 7 15 00 08 编辑 大家晚上好 这一章主要介绍一下超声波波形数据的采集 并且上传到Matlab进行信号处理 由于我们现在用的是40k的超声波频率 用stm32 ADC采样完全够了 所以这里
  • Pycham无法创建py文件的问题

    刚下载这个软件 什么都不懂就遇到了这个问题 在网上搜解决问题的办法 发现遇到这样问题的人并不多 而且遇到这个问题的原因也不一样 没办法 只能找学长问问 经过一个小时的摸索 卸载重装也没办法 最后的最后 学长发现 我的账户不是管理员身份 然后
  • 堆叠注入--攻防世界CTF赛题学习

    在一次联系CTF赛题中才了解到堆叠注入 在这里简单介绍一下 堆叠注入的原理什么的一搜一大堆 我就不引用百度了 直接进入正题 这个是攻防世界的一道CTF赛题 采用寻常思路来寻找sql注入漏洞 payload 1 and 1 1 利用paylo
  • 汽配企业为什么需要MES管理系统解决方案

    众所周知 汽配组装是汽车制造的关键环节 而汽配行业变革以精益为终极目标 制造业要想脱颖而出 就需要采用MES生产管理系统 以实现制造 物流 质量的精益化管理 在快速的流水线节拍生产下 汽配MES管理系统不仅提高了产品的质量 降低了生产成本
  • Java入门——编程案例(1)

    案例01 买飞机票 机票价格按照淡季旺季 头等舱和经济舱收费 输入机票原价 月份和头等舱或者经济舱 机票最终优惠价格的计算方案如下 旺季 5 10月 头等舱9折 经济舱8 5折 淡季 11月到来年4月 头等舱7折 经济舱6 5折 impor
  • 4. 文件系统 (FILE SYSTEM)

    所有的应用都需要存储和检索信息 当进程运行时 它可以存储有限数量的信息到自己的地址空间中 然而 其存储能力受限于虚拟地址空间的大小 对一些应用来说 虚拟地址空间并不能满足其存储需求 将信息保存在进程的地址空间的第二个问题是 当进程结束时信息
  • 科技之光-激光器知识普及

    前几天在一处看到比较好的文章记录一下
  • 建立完善的区块链游戏新生态——HTML5区块链游戏大会在京举行

    5月19日 由白鹭科技和Egretia共同主办的 2018 HTML5区块链游戏大会 HBGS 在京隆重举办 大会首次向全球发布了HTML5区块链游戏完整开发工作流 并举办HTML5区块链游戏行业联盟成立仪式 来自海内外互联网科技创新企业创
  • python缩进说法_每天一道Python选择题--python缩进

    一 开胃菜 以下代码是否正确 age 3 if age lt 6 print 不能上小学 else print 可以 A 正确 B 错误 答案 B else 语句下的 print 可以 没有缩进 程序运行报错 选B 错误 历年是个二级考点
  • c++指针之间类型转换的坑

    c 指针之间类型转换的坑 c中指针类型的转换 c 中指针类型的转换 c中指针类型的转换 C风格可以把不同类型的指针进行转换 c 中指针类型的转换 C风格可以把不同类型的指针进行转换 C 不可以 需要借助void 使用空指针 然后将空指针转换
  • Linux高阶命令:编译和反编译

    一 编译和反编译 1 编译单个C语言源文件 命令格式 gcc 文件名 c o 输出文件名 命令解释 使用gcc编译器编译源文件 并指定生成的可执行文件名 例子 在Ubuntu下 先建立并编辑一个简单的C语言程序 nano test c 使用
  • 查看Android打包时签名文件keystore的MD5值

    有些SDK提供方需要我们提供打包APK时使用的包名和签名文件 xxxxxx jks这个文件 MD5值 然后SDK服务端应该会进行比对保证商户调用的合法性 不然光靠包名是可以伪造的 怎么获取签名文件的MD5值 方法一 原先通过命令keytoo
  • cuda三维纹理内存的使用

    有时候需要使用cuda处理多帧的图像 需要把多帧时间序列的图像传入到显存中 这个时候就可以把保存图像的全局内存绑定到二维纹理内存 核函数通过纹理拾取来访问输入的图像数据 不过二维纹理内存的宽是有限制的 cudaChannelFormatDe