我对纹理如何与 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 万个)
这如何适合一维纹理?
也在内核中我发现了这个“需要更多解释,因为这里的一切都是相连的”
texture<float4, 1, cudaReadModeElementType> oldPosTex;
#define FETCH(t, i) tex1Dfetch(t##Tex, i)
在内核:
float4 pos = FETCH(oldPos, sortedIndex);
现在我还需要知道的是,我可以在帧缓冲区绘制中使用此纹理“及其定义的大小 numParticles*sizeof(float4) 而不是绘制 VBO?
最佳答案
how does this fit in the 1D texture?
纹理硬件由两个主要部分组成,纹理过滤硬件和纹理缓存。纹理过滤包括插值、标准化浮点坐标寻址以及处理越界地址(钳位、环绕、镜像和边界寻址模式)等功能。纹理缓存可以将数据存储在 space filling curve 中。最大化 2D 空间局部性(从而提高缓存命中率)。它还可以将数据存储在常规平面数组中。
最大纹理尺寸
是指纹理过滤硬件的限制,而不是纹理缓存硬件的限制。因此,它指的是使用 tex2D() 等函数时可能遇到的限制,但使用 tex1Dfetch() 等函数时可能会遇到的限制,该函数执行未经过滤的纹理查找。因此,您提供的代码可能正在为 tex1Dfetch() 进行设置。
need more explain please as everything here is connected
这个问题太宽泛,可能就是您的问题被否决的原因。
now what I need to know also, I can use this texture "with its defined size numParticles*sizeof(float4) in a frame buffer draw instead of drawing a VBO?
这不是 CUDA 问题,因为 CUDA 无法绘制任何内容。您应该查看 CUDA OpenGL 互操作性,看看您的问题是否在那里得到解答。如果不是,您应该创建一个新问题并更清楚地描述您的问题。
关于c++ - 了解纹理如何与 CUDA 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150532/