我已经创建了一个纹理对象,该对象在给定指定Width
&的情况下引用了2d音调内存。 Height
。没什么特别的。我可以使用这个纹理对象从纹理中读取并使用所有纹理'东西。
我的问题是关于如何编辑纹理,并且非常简单。一些示例显示了在内核中创建cudaSurfaceObject_t
并使用surf2Dwrite()
来编辑纹理。
为什么我应该或不应该通过内存指针使用表面而不是原始内存来编辑纹理内容?
这是主要区别吗? surface对象将确保纹理读取从纹理缓存中获取正确的值。编辑原始缓冲区不会更新当前存储在纹理缓存中的值,因此后续读取更新后的值可能不包含正确的值?
分配2d音调内存:
float* d_MyBuffer;
unsigned int Pitch;
cudaMallocPitch<float>(&d_MyBuffer, &Pitch, Width * sizeof(float), Height);
创建纹理对象:
cudaTextureObject_t t_MyTexture;
cudaResourceDesc resDescr;
memset(&resDescr, 0, sizeof(cudaResourceDesc));
resDescr.resType = cudaResourceType::cudaResourceTypePitch2D;
resDescr.res.pitch2D.desc = cudaCreateChannelDesc<float>();
resDescr.res.pitch2D.devPtr = d_MyBuffer;
resDescr.res.pitch2D.height = Height;
resDescr.res.pitch2D.pitchInBytes = Pitch;
resDescr.res.pitch2D.width = Width;
cudaTextureDesc texDescr;
memset(&texDescr, 0, sizeof(cudaTextureDesc));
texDescr.normalizedCoords = 1;
texDescr.filterMode = cudaFilterModeLinear;
texDescr.addressMode[0] = cudaAddressModeClamp;
texDescr.addressMode[1] = cudaAddressModeClamp;
texDescr.addressMode[2] = cudaAddressModeClamp;
texDescr.readMode = cudaReadModeElementType;
cudaCreateTextureObject(&t_MyTexture, &resDescr, &texDescr, NULL);
创建表面:
cudaSurfaceObject_t s_MySurface;
cudaResourceDesc surfRes;
memset(&surfRes, 0, sizeof(cudaResourceDesc));
surfRes.resType = cudaResourceType::cudaResourceTypePitch2D;
surfRes.res.pitch2D.desc = cudaCreateChannelDesc<float>();
surfRes.res.pitch2D.devPtr = d_MyBuffer;
surfRes.res.pitch2D.height = Height;
surfRes.res.pitch2D.pitchInBytes = Pitch;
surfRes.res.pitch2D.width = Width;
cudaCreateSurfaceObject(&s_MySurface,&surfRes)
在内核中我应该使用:
surf2Dwrite(value, s_MySurface, x, y);
或者我应该在内核中使用:
d_MyBuffer[x + Pitch*y] = value;
我为代码中的任何拼写错误道歉。这更像是一个概念性问题而不是编码语法问题。