编辑Cuda纹理对象

编辑Cuda纹理对象,cuda,Cuda,我已经创建了一个纹理对象,它引用了给定指定宽度和高度的2d倾斜内存。没什么特别的。我可以使用这个纹理对象来读取纹理,并利用所有的纹理“素材” 我的问题是关于如何编辑纹理的,非常直接。一些示例显示如何创建cudaSurfaceObject\u t,并在内核中使用surf2Dwrite()编辑纹理 为什么我应该或不应该通过内存指针使用曲面而不是原始内存来编辑纹理内容? 这是主要区别吗?曲面对象将确保从纹理读取从纹理缓存获得正确的值。编辑原始缓冲区不会更新当前存储在纹理缓存中的值,因此后续读取的更新值

我已经创建了一个纹理对象,它引用了给定指定
宽度
高度
的2d倾斜内存。没什么特别的。我可以使用这个纹理对象来读取纹理,并利用所有的纹理“素材”

我的问题是关于如何编辑纹理的,非常直接。一些示例显示如何创建
cudaSurfaceObject\u t
,并在内核中使用
surf2Dwrite()
编辑纹理

为什么我应该或不应该通过内存指针使用曲面而不是原始内存来编辑纹理内容?

这是主要区别吗?曲面对象将确保从纹理读取从纹理缓存获得正确的值。编辑原始缓冲区不会更新当前存储在纹理缓存中的值,因此后续读取的更新值可能不包含正确的值

分配2d倾斜内存:

float* d_MyBuffer;
unsigned int Pitch;
cudaMallocPitch<float>(&d_MyBuffer, &Pitch, Width * sizeof(float), Height);
或者在内核中,我更喜欢使用:

surf2Dwrite(value, s_MySurface, x, y);
d_MyBuffer[x + Pitch*y] = value;

我为代码中的任何错误道歉。这更多的是一个概念问题,而不是编码语法问题。

纹理缓存是不一致的。直接应用于纹理底层存储的任何更改都可能反映在纹理缓存中,也可能不反映在纹理缓存中。假设您希望在下次使用纹理时反映对纹理的更改,因此这种方法不适合。如果我在一次内核调度中更新纹理底层缓冲区,然后在后续内核调度中访问更新后的纹理,缓存不会保持一致吗?除了缓存问题,您认为这两种方法都有什么好处吗?纹理缓存是内核启动的一部分,因此更新纹理的内存保证会反映在同一个流中运行的下一个内核中,对吗。只要您在修改同一内核中的底层内存后不尝试从纹理读取,您的代码就会很好(我在生产代码中使用了这种方法)。cuda simpleSurfaceWrite示例代码中包含了一个示例实现,演示了一个表面写入内核和一个纹理读取内核,其中,曲面写入与随后在纹理访问中读取的基础数据相同。如前所述,尝试在同一内核中进行表面写入(或对基础数据进行任何其他类型的修改)并不能保证在同一基础数据上进行后续纹理读取会产生可预测的结果。我被上述代码所误导,尝试对表面对象使用倾斜内存,但没有效果。表面对象似乎只接受cudaArray而不接受pitch2D。纹理缓存是非相干的。直接应用于纹理底层存储的任何更改都可能反映在纹理缓存中,也可能不反映在纹理缓存中。假设您希望在下次使用纹理时反映对纹理的更改,因此这种方法不适合。如果我在一次内核调度中更新纹理底层缓冲区,然后在后续内核调度中访问更新后的纹理,缓存不会保持一致吗?除了缓存问题,您认为这两种方法都有什么好处吗?纹理缓存是内核启动的一部分,因此更新纹理的内存保证会反映在同一个流中运行的下一个内核中,对吗。只要您在修改同一内核中的底层内存后不尝试从纹理读取,您的代码就会很好(我在生产代码中使用了这种方法)。cuda simpleSurfaceWrite示例代码中包含了一个示例实现,演示了一个表面写入内核和一个纹理读取内核,其中,曲面写入与随后在纹理访问中读取的基础数据相同。如前所述,尝试在同一内核中进行表面写入(或对基础数据进行任何其他类型的修改)并不能保证在同一基础数据上进行后续纹理读取会产生可预测的结果。我被上述代码所误导,尝试对表面对象使用倾斜内存,但没有效果。表面对象似乎只接受cudaArray而不接受pitch2D。
surf2Dwrite(value, s_MySurface, x, y);
d_MyBuffer[x + Pitch*y] = value;