了解纹理如何与 CUDA 配合使用

understanding how textures work with CUDA

本文关键字:CUDA 纹理 了解      更新时间:2023-10-16

我对纹理如何与 CUDA 一起工作感到困惑

就像当我"在我的GTX 780上"进行设备查询时,我发现:

Maximum Texture Dimension Size (x,y,z)  1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)

现在当我调查 CUDA"粒子示例"时,我发现:

checkCudaErrors(cudaBindTexture(0, oldPosTex, sortedPos, numParticles*sizeof(float4)));

在我的情况下,numParticle 已将其提高到 1024 * 1024 * 2(约 210 万(

这如何适应 1D 纹理?

同样在内核中,我发现这个"需要更多解释,因为这里的一切都是连接的">

texture<float4, 1, cudaReadModeElementType> oldPosTex;
#define FETCH(t, i) tex1Dfetch(t##Tex, i)

在内核:

float4 pos = FETCH(oldPos, sortedIndex); 

现在我还需要知道的是,我可以在帧缓冲区绘制中使用这种纹理"以其定义的大小 numParticles*sizeof(float4( 而不是绘制 VBO?

这如何适应 1D 纹理?

纹理硬件

由两个主要部分组成,即纹理过滤硬件和纹理缓存。纹理过滤包括插值、通过规范化浮点坐标寻址和处理越界地址(钳位、换行、镜像和边框寻址模式(等功能。纹理缓存可以将数据存储在空间填充曲线中,以最大化 2D 空间局部性(从而最大化缓存命中率(。它还可以将数据存储在常规平面数组中。

Maximum Texture Dimension Size是指纹理过滤硬件中的限制,而不是纹理缓存硬件中的限制。因此,它指的是您在使用tex2D()等函数时可能会遇到的限制,但在使用tex1Dfetch()等函数时不会达到的限制,它执行未过滤的纹理查找。因此,您提供的代码可能正在为tex1Dfetch()设置内容。

需要更多解释,因为这里的一切都是连接的

这个问题太宽泛了,可能是你的问题被否决的原因。

现在我还需要知道的是,我可以在帧缓冲区绘制中使用这种纹理"以其定义的大小 numParticles*sizeof(float4( 而不是绘制 VBO?

这不是 CUDA 问题,因为 CUDA 无法绘制任何东西。您应该查看CUDA OpenGL互操作,看看您的问题是否在那里得到解答。如果不是,您应该创建一个新问题并更清楚地描述您的问题。