七种武器之二:用texture 来代替global memory reading

本文介绍了一种通过使用纹理来优化GPU内存访问的方法,旨在减少数据读取时的延迟,提高并行计算效率。文章详细展示了如何声明纹理和线性内存,并通过具体的CUDA C++代码示例解释了如何绑定纹理及调用不同的内核函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们的算法包括多个kernel,而如果用两个global memory来存储input / output的话,实在是很浪费时间。

因为对于一个kernel,只有当计算量很大的时候,才能用computing 来隐藏global memory的latency。如果只是简单地取出一个数据来,做一个运算,再写回去,那么大部分的时间都是浪费在等待memory transfer了。

这时候可以用texture来做为input,当然写数据的时候还得写到global memory里的。

 

//declare texture and linear memory

texture<....> interSrcTex;

texture<....> interDstTex;

 

float *d_interSrcData, *d_interDstData;

 

//init

cudaMallocPitch((void**)&d_interSrcData, &pitch, PPL * sizeof(float), LPF);
cudaMallocPitch((void**)&d_interDstData, &pitch, PPL * sizeof(float), LPF);

cudaBindTexture2D(0, interSrcTex, d_interSrcData, floatTexDesc, PPL, LPF, pitch);
cudaBindTexture2D(0, interDstTex, d_interDstData, floatTexDesc, PPL, LPF, pitch);

 

__global__ void func1(texture<...> inputTex, float* outData)

{

......

}

 

__global__ void func2(texture<....> inputTex, float* outData)

{

......

}

 

//call the different kernels like this way

void main()

{

    func1(interSrcTex, d_interDstData);

    func2(interDstTex, d_interSrcData);

 

}

 

这样至少可以在read data上快一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值