天天看點

CUDA學習(六十三)

記憶體聲明:

裝置和常量記憶體:

使用<code>__device__</code>或<code>__constant__</code>記憶體空間說明符在檔案範圍内聲明的記憶體在使用裝置運作時時具有相同的行為。 所有核心都可以讀取或寫入裝置變量,無論核心是由主機還是裝置運作時初始啟動。 等同地,所有核心将具有與在子產品範圍内聲明的<code>__constant__</code>相同的視圖。

紋理和表面記憶體:

CUDA支援動态建立的紋理和表面對象1,其中可以在主機上建立紋理參考,傳遞給核心,由核心使用,然後從主機中銷毀。 裝置運作時不允許從裝置代碼中建立或銷毀紋理或表面對象,但可以在裝置上自由使用并自由傳送由主機建立的紋理和表面對象。 無論它們在哪裡建立,動态建立的紋理對象總是有效的,并且可以從父級傳遞給子級核心。

裝置運作時不支援從裝置啟動的核心中的傳統子產品範圍(即費米架構)紋理和表面。 子產品範圍(遺留)紋理可以從主機建立并在裝置代碼中用于任何核心,但隻能由頂級核心(即從主機啟動的)使用。

1:動态建立的紋理和曲面對象是CUDA 5.0引入的CUDA記憶體模型的補充。 有關詳細資訊,請參閱CUDA程式設計指南。

共享記憶體變量聲明:

在CUDA中,C / C ++共享記憶體可以聲明為靜态大小的檔案範圍變量或函數範圍變量,也可以聲明為外部變量,其大小由核心的調用者在運作時通過啟動配置參數确定。 這兩種類型的聲明在裝置運作時間下均有效。

符号位址:

由于所有全局範圍的裝置變量都在核心的可見位址空間中,是以裝置端符号(即标記為<code>__ device_</code>的那些符号)可以通過簡單的&運算符從核心中引用。 這也适用于<code>__constant__</code>符号,但在這種情況下,指針将引用隻讀資料。

考慮到裝置端符号可以直接引用,引用符号的CUDA運作時API(例如cudaMemcpyToSymbol()或cudaGetSymbolAddress())是多餘的,是以裝置運作時不支援。 注意這意味着即使在子核心啟動之前,也不能在運作的核心中更改常量資料,因為對<code>__constant__</code>空間的引用是隻讀的。

CUDA學習(六十三)

繼續閱讀