[英]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.