CUDA Texture Memory

Part.1 �介

在�绦� CUDA 程式前,都要把�Y料先�� Host 的����w,�}�u一份到 device 的����w中;一般�碚f,�@�拥牟糠郑�都是使用 device 的 global memory �碇苯舆M行存取。不�^���H上,有的�r候�有�e的�x�竦摹�在《nVidia CUDA �介》中一文就有提到,除了 global memory 外,�可以透�^ constant memorytexture memory 的形式,��� device memory �Y料的存取。


texture 是一般 graphics �e的名�~,2D texture 大致上可以理解�橐���D片,一般���是翻�g成材�|(�S基百科是�Q�椤��y理」);而由於在�鹘y的 render pipeline 中,texture �琢撕苤匾�的地位,所以在�@示卡的部分,也�����@部分做特殊的最佳化。而在 nVidia 的 CUDA 中,也把 texture �@�元素保留下�砹耍�


如果在 CUDA 中把 device memory 的�Y料,��作使用 texture 的�,那�Y料���成是 唯�x的,要透�^特殊的函式�碜x取,�]有�k法�M行修改;不�^相�Φ模�和 global memory 或 constant memory 比起�恚�也有不少���c~(���Y料��⒖肌�CUDA Programming Guide 1.1》的 5.4)


  • 有快取,在某些��r下�l����比�^大  

  • 不像 global/constant memory 要依照某些存取模式下才有比�^好的效能  

  • 位置�算的延�t被�[藏得更好,��於�S�C存取�Y料的效能可能更好  

  • 被封包�^的�Y料可以在一���\算中被���e的��凳褂�  

  • 8bit 和 16bit 整�悼梢院��蔚霓D�Q成 [0.0, 1.0] 或 [-1.0, 1.0]


除了上述的���c外,如果使用 CUDA Array �懋� texture 的�,更可以套用 filter、使用�冉ǖ墓δ�碜�炔迦≈怠�K且�O定要用 clamping 或 repeat 模式�理�界。


而在 CUDA 中,要使用 texture 的�,是要使用所�^的「texture reference」;下面就大概�斫榻B CUDA 中 texture 的使用方法。首先,他的大致流程��是:

  • Host 的 texture 建立部分  
    • 宣告出 texture reference  
    • 透�^ Bind Texture 的函式,�� texture reference 和�F有的 device memory 上的��担�linear memory 或 CUDA array)做�B�Y
  • Device 使用  
    • 透�^ CUDA 提供的 texture �x取函式(tex1Dfetch, tex1D, tex2D)�碜x取 texture 的�热�
  • Host �h除 texture  
    • 呼叫 unbind texture 的函式,�� texture reference 的�Y源�放


不�^,在 CUDA 中,��於 texture 的控制,有 low-level 和 high level �煞N,Heresy 在�@就先��Ρ容^��蔚� high-level 方法�碜鲆恍┖��蔚恼f明。


CUDA 的 texture 型�e
在 CUDA 中,有提供名�� texture 的 template 型�e,他的形式是:
  1. texture<Type, Dim, ReadMode> texRef;
复制代码

其中:


  • Type
    texture 中元素的�Y料型�e;可以是一般的基本的 int, float 型�e,也可以是 CUDA 中提供的 vector 型�e。

  • Dim
    代表�@�� texture 的�S度,在 CUDA 中只有 12 �煞N值,�K不支援 3D texture。

  • ReadMode
    �x取 texture 的模式,有 cudaReadModeNormalizedFloatcudaReadModeElementType �煞N模式。��模式是 cudaReadModeElementType �r,�Y料��以原�淼姆绞阶x取出�恚划�模式是 cudaReadModeNormalizedFloat、且�Y料型�e是整�敌�e�r,他�t�����Y料�M行 normalize,�骰� [0,1] 或 [-1,1] 之�g的�担ㄒ�原始型�e是否�� unsigned �Q定)。

�e��例子,如果我��要宣告一���Y料型�e是 int 的 1D texture,就可以��成:

  1. texture<int, 1, cudaReadModeElementType> texRef;
复制代码

texRef 的�Y料,�t�要再透�^ BindTexture 的函式,�砗� device 上的��底鲞B�Y,�@�硬潘阃瓿� texture 的使用前��洹�
不�^另外一��要注意的是,目前的 CUDA 似乎只允�S�� texture reference 宣告成 globalvariable,而�o法�⑺�宣告在函式�龋�用��档姆椒�鬟f�o kernel function(Heresy �@�����使得 nvcc�a生�炔垮e�`,要��在 file-scope 是�⒖� ISI 的�n程後才知道的)。



�煞N不同的 texture �Y料
在 CUDA 中,可以接受�煞N�Y料: linear memoryCUDA array。其中,linear memory 就是之前提�^,用 cudaMalloc() cudaMallocArray(),�硇�告出一�K�B�m的 1D/2D �列。 宣告出的�B�m����w空�g(一�S�列);而 CUDA array �t是透�^ 由�煞N不同的�Y料所建立出�淼� texture reference,在使用上有一些不同的性�|:

   Texture with linear memory Texture with CUDA Array
�S度 只有一�S 一�S或二�S
�x取的索引 整�� 整�祷蚋↑c��
filter 不支援 支援 (cudaFilterModeLinear / cudaFilterModePoint)
�界值 n/a cudaAddressModeClamp / cudaAddressModeWrap
�x取函式 tex1Dfetch() tex1D() / tex2D()
透�^ CUDA array 的 texture,可以� CUDA 直接�兔ψ龊�炔澹��m然目前看�碇挥芯�性�炔澹�、�值�理的���},其��在很多�r候都是相��方便的~

而由於使用 linear memory 和 CUDA array 的 texture 在使用上有不少的差��,所以接下�砭头珠_��吧

你可能感兴趣的:(职场,休闲)