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

标签 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(大约 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/

相关文章:

c++ - 在 Qt5 中断开 lambda 函数

c++ - 在 C++ 中打印一个数组?

cmake - 交叉编译c/c++/cuda程序时尝试使用CMake

memory - CUDA 本地内存寄存器溢出开销

asynchronous - CUDA 中异步 memcpy 期间的设备同步

c++ - Windows SDK 7.1 编译器上的 yvals.h C4514 警告

c++ - QShortcut 不工作

OpenGL Barrier() 函数和发散流控制

c - OpenGL - 帧缓冲区深度纹理不同于颜色深度纹理

opengl - OpenGL color4 alpha 是如何工作的?