我对纹理如何与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吗?
答案 0 :(得分:3)
这如何适合1D纹理?
纹理硬件由两个主要部分组成,即纹理过滤硬件和纹理缓存。纹理过滤包括插值,通过标准化浮点坐标寻址和处理越界地址(钳位,包裹,镜像和边界寻址模式)等功能。纹理缓存可以将数据存储在space filling curve中以最大化2D空间局部性(从而最大化缓存命中率)。它还可以将数据存储在常规平面阵列中。
Maximum Texture Dimension Size
指的是纹理过滤硬件的限制,而不是纹理缓存硬件。因此,它指的是在使用tex2D()
等函数时可能遇到的限制,但在使用tex1Dfetch()
等执行未过滤纹理查找的函数时却没有。因此,您提供的代码可能是为tex1Dfetch()
设置的。
需要更多解释,因为这里的一切都已连接
这个问题过于宽泛,可能就是为什么你的问题被低估了。
现在我还需要知道,我可以在帧缓冲区绘制中使用此纹理“及其定义的大小numParticles * sizeof(float4)而不是绘制VBO吗?
这不是CUDA问题,因为CUDA无法绘制任何内容。您应该查看CUDA OpenGL互操作,看看您的问题是否得到了解答。如果不是,您应该创建一个新问题并更清楚地描述您的问题。