了解纹理如何与 CUDA 配合使用
understanding how textures work with CUDA
我对纹理如何与 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)));
在我的情况下,numParticle 已将其提高到 1024 * 1024 * 2(约 210 万(
这如何适应 1D 纹理?
同样在内核中,我发现这个"需要更多解释,因为这里的一切都是连接的">
texture<float4, 1, cudaReadModeElementType> oldPosTex;
#define FETCH(t, i) tex1Dfetch(t##Tex, i)
在内核:
float4 pos = FETCH(oldPos, sortedIndex);
现在我还需要知道的是,我可以在帧缓冲区绘制中使用这种纹理"以其定义的大小 numParticles*sizeof(float4( 而不是绘制 VBO?
纹理硬件这如何适应 1D 纹理?
由两个主要部分组成,即纹理过滤硬件和纹理缓存。纹理过滤包括插值、通过规范化浮点坐标寻址和处理越界地址(钳位、换行、镜像和边框寻址模式(等功能。纹理缓存可以将数据存储在空间填充曲线中,以最大化 2D 空间局部性(从而最大化缓存命中率(。它还可以将数据存储在常规平面数组中。
Maximum Texture Dimension Size
是指纹理过滤硬件中的限制,而不是纹理缓存硬件中的限制。因此,它指的是您在使用tex2D()
等函数时可能会遇到的限制,但在使用tex1Dfetch()
等函数时不会达到的限制,它执行未过滤的纹理查找。因此,您提供的代码可能正在为tex1Dfetch()
设置内容。
需要更多解释,因为这里的一切都是连接的
这个问题太宽泛了,可能是你的问题被否决的原因。
现在我还需要知道的是,我可以在帧缓冲区绘制中使用这种纹理"以其定义的大小 numParticles*sizeof(float4( 而不是绘制 VBO?
这不是 CUDA 问题,因为 CUDA 无法绘制任何东西。您应该查看CUDA OpenGL互操作,看看您的问题是否在那里得到解答。如果不是,您应该创建一个新问题并更清楚地描述您的问题。
- 编译时未启用intel oneApi CUDA支持
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 使用 CUDA 和纹理进行图像减法
- Cuda 从黑/白图像创建纹理对象
- 为什么我的数据不适合CUDA纹理对象
- Cuda-从设备全局内存复制到纹理内存
- CUDA 纹理无法返回无符号长长长的值类型
- 了解纹理如何与 CUDA 配合使用
- CUDA 中的全局内存和纹理有什么区别?
- 如何在结构中嵌入CUDA纹理对象
- CUDA动态并行性:使用纹理内存时无效的全局写入
- 结合纹理记忆统一记忆在CUDA 6
- CUDA模板内核和纹理
- CUDA中作为纹理的3D阵列写入和读取
- 如何在CUDA中将不同种类的纹理绑定到纹理引用
- CUDA纹理对象问题
- 使用CUDA, SFML和OpenGL:纹理拒绝出现在Quad上
- CUDA纹理和夹紧