簡體   English   中英

CUDA模板內核和紋理

[英]CUDA template kernels and textures

我正在嘗試在CUDA中實施利用紋理內存的通用內核,但遇到了問題。

template<typename T>
__global__(void){
   tex3D( // correct texture for type T )
}

// host pseudo code
template <typename T>
__host__(void){
    if(T == 'short')
       bind(short_texture);
    else if (T == 'int')
       bind(int_texture);
    invoke_kernel<>(); // <--- How do I tell the kernel which texture was just bound
}

本質上,我所需要的是基於模板參數T訪問正確綁定的紋理。我知道我可以做一些復雜的事情,例如編寫和調用不同的內核,或者傳遞一個指示使用哪個紋理的變量。 我希望有一個更清潔的解決方案。 有什么建議么? 我寧願避免將內核復制太小的內容,因為那樣會破壞模板的目的。

編輯:

為了明確起見,我有一個模板內核,例如一個數據復制內核,它在T類型的全局內存上運行。Ergo,short數組,int數組等。為了執行任何類型的副本。 我想移動它以將紋理內存用於其他內核,但是,我不確定如何正確訪問正確的紋理。 我提供了可用的全局紋理引用,該引用適用於我希望支持的每種類型,並且我有邏輯來綁定CPU端的正確紋理。 我的問題是,告訴我的內核在tex2D函數調用中使用哪個紋理引用的正確方法是什么? 當然,該決定取決於該內核的模板參數(即,我應該使用float紋理還是int紋理)。 我正在尋找可以遵循的模式或設計,因為我不確定解決該問題的最佳方法。

使用紋理對象而不是紋理引用。 使用紋理對象,所有紋理參數都在運行時而不是在編譯時定義。

如果您需要堅持使用紋理參考,則另一種可能性是包裝紋理提取調用,如下所示:

template <typename T>
__device__  T myTextureFetch(float x, float y, float z)
{
    return tex3D(tex_ref_to_T_type, x, y, z);
}

(代碼是在瀏覽器中編寫的,無需檢查...)對於每種要使用的類型,您都需要使用以下簡短包裝之一...

此外,如果僅需要紋理作為全局內存的緩存讀取,請檢查__restrict__關鍵字是否更適合您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM