NVIDIA CUDA 学习 (5) Texture Memory

本文介绍了NVIDIA CUDA中的纹理内存如何用于加速应用,特别是在处理非连续内存访问时能提供性能提升。通过一个热传导模型的示例,详细阐述了算法的三个步骤,并展示了如何在实际代码中应用纹理内存以优化迭代更新过程。
摘要由CSDN通过智能技术生成

纹理内存

在这里插入图片描述纹理内存可以加速应用主要原因有两方面:

  1. 纹理内存也是缓存在片上的,因此一些情况下相比从芯片外的DRAM上获取数据,纹理内存可以通过减少内存请求来提高带宽。

  2. 纹理内存是针对图形应用设计的,可以更高效地处理局部空间的内存访问。

  3. 从数学的角度,上图中的4个地址并非连续的,在一般的CPU缓存中,这些地址将不会缓存。但由于GPU纹理缓存是专门为了加速这种访问模式而设计的,因此如果在这种情况中使用纹理内存而不是全局内存,那么将会获得性能的提升。
    这一段转自https://blog.csdn.net/shuzfan/article/details/77095270

热传导模型

在这里插入图片描述在这里插入图片描述在这里插入图片描述

	// these exist on the GPU side
	texture<float> texConstSrc;
	texture<float> texIn;
	texture<float> texOut;
	HANDLE_ERROR( cudaMalloc( (void**)&data.dev_inSrc,
	imageSize ) );
	HANDLE_ERROR( cudaMalloc( (void**)&data.dev_outSrc,
	imageSize ) );
	HANDLE_ERROR( cudaMalloc( (void**)&data.dev_constSrc,
	imageSize ) );
	HANDLE_ERROR( cudaBindTexture( NULL, texConstSrc,
	data.dev_constSrc,
	imageSize ) );
	HANDLE_ERROR( cudaBindTexture( NULL, texIn,
	data.dev_inSrc,
	imageSize ) );
	HANDLE_ERROR( cudaBindTexture( NULL, texOut,
	data.dev_outSrc,
	imageSize ) );

算法分为三步:

  1. 首先,我们先强行把heater的温度覆盖到input上去,以保持heater温度不变的约束。这一部分在函数copy_const_kernel()中实现。首先定位当前格子在哪,然后如果在constant温度矩阵里这个格子不为0,那么我们就将constant的heater的温度给复制到当前的input中去,完成了约束的维护。
__global__ void copy_const_kernel( float *iptr,
const float *cptr ) {
   
	// map from threadIdx/BlockIdx to pixel position
	int x = threadIdx.x + blockIdx.x * blockDim.x;
	int y = threadIdx.y + blockIdx.y * blockDim.y;
	int offset = x + y * blockDim.x * gridDim.x;
	if (cptr[offset] != 0) iptr[offset] = cptr[offset];
}
  1. 根据温度传递更新公式,计算每个格子的温度,输出到output buffer。这一部分在 blend_kernel()中实现。在寻找每个格子周围inde
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值