我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第16天,我们用几天时间来学习CUDA 的编程接口,其中最重要的部分就是CUDA C runtime.希望在接下来的84天里,您可以学习到原汁原味的CUDA,同时能养成英文阅读的习惯。
本文共计76字,阅读时间5分钟
A texture object is created using cudaCreateTextureObject() from a resource description of type struct cudaResourceDesc, which specifies the texture, and from a texture description defined as such:
· addressMode specifies the addressing mode;
· filterMode specifies the filter【插值】 mode;
· readMode specifies the read mode;
· normalizedCoords specifies whether texture coordinates are normalized or not;
· See reference manual for sRGB, maxAnisotropy, mipmapFilterMode, mipmapLevelBias, minMipmapLevelClamp, and maxMipmapLevelClamp.
The following code sample applies some simple transformation kernel to a texture.
本文备注/经验分享:
昨天开始我们开始介绍纹理内存。
什么情况下使用纹理内存? 需要使用免费的地址变换, 值变换(归一化读取方式), 边界处理, 以及, 可能的CUDA Array的缓存优势的时候用,还有自带的免费插值(线性)。 不需要这些特性的请使用普通读取。请注意现在的卡使用纹理不一定有提速效果,这个不保证的。以前说纹理提速巨大那是说的1.X,1.X普通读取无缓存。现在已经过时了。
A texture object is created using cudaCreateTextureObject() from a resource description of type struct cudaResourceDesc, which specifies the texture, and from a texture description.... 这句是字面意思. 没啥可说的。主要注意,Texture Object没有单独的一个绑定过程,在创建的时候就已经绑定了。什么情况下要用纹理对象API ? 任何时候都可以使用,新代码建议总是使用Texture Object。 Texture Object的一大特点就是能作为参数用。
The following code sample applies some simple transformation kernel to a texture.这段读取texture,做简单的变换,这代码是做图像旋转的。(1)x和y坐标,分别除以总宽度和高度,这是将X: [0,W)和Y:[0,H)变换到(0,1)和(0,1)上
(坐标归一化),然后各自减掉0.5, 平移, 平移原点到中心位置,再用旋转公式在新坐标系下, 对新原点旋转, 因为之前平移过。对于对图像原本的中点旋转,旋转完了, 再恢复原本的以图像(0,0)点为原点, 平移回来。这样就得到了对中点旋转后的新坐标了。新坐标依然是归一化的,然后用texture的归一化坐标进行读取。最后将旋转后的结果图像,保存到普通内存。注意普通内存这里是普通坐标(x,y)的这种。x和y来自线程编号和block编号。另外注意这里用的是纹理的线性插值,如果旋转后的新坐标落到了原本的一些点的中间。则用它们的线性插值平均后的值作为新值,这样多少能让旋转后的图像变得平滑一点。
或者在我们的技术论坛bbs.gpuworld.cn上发帖