了解纹理如何与CUDA一起工作

时间:2013-11-22 17:08:39

标签: c++ opengl cuda textures

我对纹理如何与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(大约2.1百万)

这如何适合1D纹理?

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

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

在内核:

float4 pos = FETCH(oldPos, sortedIndex); 

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

1 个答案:

答案 0 :(得分:3)

  

这如何适合1D纹理?

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

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

  

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

这个问题过于宽泛,可能就是为什么你的问题被低估了。

  

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

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