【问题标题】:understanding how textures work with CUDA了解纹理如何与 CUDA 一起使用
【发布时间】:2013-12-07 16:02:01
【问题描述】:

我对纹理如何与 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)));

在我的例子中,我将 numParticles 提高到 1024 * 1024 * 2(大约 210 万)

这如何适合 1D 纹理??

在内核中我也发现了这个“需要更多解释,因为这里的所有东西都是连接的”

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

在内核:

float4 pos = FETCH(oldPos, sortedIndex); 

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

【问题讨论】:

  • 解释为什么在问一个我不明白的简单事情时投反对票

标签: c++ opengl cuda textures


【解决方案1】:

这如何适合 1D 纹理?

纹理硬件由两个主要部分组成,纹理过滤硬件和纹理缓存。纹理过滤包括插值、标准化浮点坐标寻址和处理越界地址(钳位、环绕、镜像和边界寻址模式)等功能。纹理缓存可以将数据存储在space filling curve 中,以最大化二维空间局部性(从而提高缓存命中率)。它还可以将数据存储在常规的平面数组中。

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

需要更多解释,因为这里的所有内容都已连接

这个问题过于宽泛,可能是您的问题被否决的原因。

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

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

【讨论】:

  • 非常感谢您澄清事情:),虽然我需要了解更多,但担心“因为我只使用纹理来存储我的数据”的限制。使用 'cudaBindTexture' 时,这类似于 CudaMalloc?所以它指定了该纹理的已知大小?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多