当前位置: 首页 > ops >正文

CUDA 纹理入门

一、什么是CUDA纹理

CUDA纹理是NVIDIA GPU提供的一种特殊内存访问机制,它允许高效地访问和过滤结构化数据。纹理内存最初是为图形渲染设计的,但在通用计算(GPGPU)中也很有用。

二、纹理内存的优势

  1. 缓存优化:纹理内存有专用的缓存,适合空间局部性好的访问模式

  2. 硬件过滤:支持自动的线性插值等操作

  3. 边界处理:可以自动处理越界访问

  4. 多维访问:方便处理2D、3D数据

三、纹理引用操作纹理

基本使用步骤

1. 声明纹理引用

c

texture<DataType, Type, ReadMode> texRef;
DataType (数据类型)
  • ucharuchar2uchar4

  • scharchar2char4

  • ushortushort2ushort4

  • shortshort2short4

  • uintuint2uint4

  • intint2int4

  • floatfloat2float4

Type (纹理类型)
  • cudaTextureType1D: 一维纹理

  • cudaTextureType2D: 二维纹理

  • cudaTextureType3D: 三维纹理

  • cudaTextureTypeCubemap: 立方体贴图

  • cudaTextureType1DLayered: 分层一维纹理

  • cudaTextureType2DLayered: 分层二维纹理

ReadMode (读取模式)
  • cudaReadModeElementType: 直接读取元素类型

  • cudaReadModeNormalizedFloat: 将整数类型归一化为[0.0, 1.0]或[-1.0, 1.0]的浮点数

示例:

c

texture<float, 2, cudaReadModeElementType> texRef;

cudaReadModeElementType表示纹理将按照内存中的原始数据类型直接读取数据,不进行任何格式转换。与之相对的是cudaReadModeNormalizedFloat,后者会将整数类型数据自动归一化为浮点数。 

2. 纹理参数配置

地址模式 (addressMode)

控制纹理坐标超出[0,1]范围时的行为:

c

texRef.addressMode[0] = ...; // 第一维(x)的地址模式
texRef.addressMode[1] = ...; // 第二维(y)的地址模式
texRef.addressMode[2] = ...; // 第三维(z)的地址模式

可选值:

  • cudaAddressModeWrap: 环绕模式(重复纹理)

    • 坐标1.25 → 0.25

    • 坐标-0.25 → 0.75

  • cudaAddressModeClamp: 钳制模式(边缘延伸)

    • 坐标1.25 → 1.0

    • 坐标-0.25 → 0.0

  • cudaAddressModeMirror: 镜像模式(交替重复)

    • 坐标1.25 → 0.75

    • 坐标2.25 → 0.25

  • cudaAddressModeBorder: 边界模式(返回零)

    • 超出范围的坐标返回(0,0,0,0)

过滤模式 (filterMode)

控制纹理采样的插值方式:

c

texRef.filterMode = cudaFilterModePoint;  // 最近邻采样
texRef.filterMode = cudaFilterModeLinear; // 线性插值
  • cudaFilterModePoint: 返回最接近纹理坐标的纹素

  • cudaFilterModeLinear: 对2D纹理执行双线性插值,对1D纹理执行线性插值

注意:线性过滤需要浮点数据类型或cudaReadModeNormalizedFloat模式

归一化坐标 (normalized)

c

texRef.normalized = true;  // 使用[0,1]范围的归一化坐标
texRef.normalized = false; // 使用[0,width)或[0,height)的实际坐标
  • true: 坐标自动归一化到[0,1]范围

  • false: 使用实际像素坐标

其他高级参数
各向异性过滤 (maxAnisotropy)

c

texRef.maxAnisotropy = 1; // 默认值(各向同性过滤)

控制各向异性过滤的

http://www.xdnf.cn/news/7007.html

相关文章:

  • replay下载
  • SOLID 面对象设计的五大基本原则
  • 一种基于条件约束注意力生成对抗网络的水下图像增强模型
  • 二叉树构造:从前序、中序与后序遍历序列入手
  • USB学习【11】STM32 USB初始化过程详解
  • 【AI】Ubuntu 22.04 4060Ti16G 基于SWIFT框架的LoRA微调 模型Qwen3-1.8B 数据集弱智吧 微调笔记
  • 【iOS】探索消息流程
  • 上位机知识篇---流式Web服务器模式的实现
  • STM32SPI通信基础及CubeMX配置
  • OVS练习笔记20250518
  • Kubernetes控制平面组件:Kubelet详解(五):切换docker运行时为containerd
  • Vue-监听属性
  • 报错System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”
  • 面试中的线程题
  • 数据结构:二叉树一文详解
  • Linux安全第三章-系统安全及应用
  • 深入浅出Hadoop:大数据时代的“瑞士军刀”
  • 面向GIS的Android studio移动开发(二)--在地图上绘制电子围栏
  • Linux(2)——shell原理及Linux中的权限
  • 黑灰产业链深度解析
  • 最新缺陷检测模型:EPSC-YOLO(YOLOV9改进)
  • 使用 C# 入门深度学习:线性代数详细讲解
  • Android 性能优化入门(一)—— 数据结构优化
  • MLLM常见概念通俗解析(三)
  • Java面试深度解析:微服务与云原生技术应用场景详解
  • 互联网大厂Java面试:从Spring到微服务的深度探讨
  • 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting
  • svn: E170013 和 svn: E120171 的问题
  • 二分算法的介绍简单易懂
  • 想要建站但没有服务器?雨云RCA,免服务器即可搭建完整网站!!!