2013-01-20 81 views
2

我有一塊C++ CUDA代碼,我必須寫出以float形式聲明數據變量。我還必須重寫用double聲明數據變量的代碼。用於CUDA代碼的C++設計

在CUDA中處理這種情況的好設計是什麼?

我不想有兩組相同的代碼,因爲那麼在將來任何更改時,我將不得不更改兩組其他代碼。我也想保持代碼清潔,不用太多的#ifdef在代碼中的float和double之間切換。

任何人都可以請建議任何好(在維護和「易於閱讀」)設計?

回答

6

CUDA支持類型模板化,毫無疑問,它是實現內核代碼的最有效方式,您需要在同一代碼中處理多種類型。

作爲一個簡單的例子,考慮一個簡單的BLAS AXPY類型的內核:

template<typename Real> 
__global__ void axpy(const Real *x, Real *y, const int n, const Real a) 
{ 
    int tid = threadIdx.x + blockIdx.x * blockDim.x; 
    int stride = blockDim.x * gridDim.x; 

    for(; tid<n; tid += stride) { 
     Real yval = y[tid]; 
     yval += a * x[tid]; 
     y[tid] = yval; 
    } 
} 

此模板內核可以被實例化雙精度與單精度不失一般性:

template axpy<float>(const float *, float *, const int, const float); 
template axpy<double>(const double *, double *, const int, const double); 

推力模板庫隨CUDA工具包的所有最新版本一起提供,廣泛使用該工具來實現類型不可知的算法。

+0

哇!我不知道這存在。非常感謝你。有沒有我可以看的任何教程類文檔。 – user1612986

+0

在編程指南的附錄中簡要討論了CUDA中支持的C++特性。 – talonmies

+0

另請參閱[這個問題](http://stackoverflow.com/a/6179580/681865)另一個非常有用的基於模板的CUDA設計模式。 – talonmies

2

除了模板,你可以達到你想要什麼用單一的typedef:

typedef float mysize; // or double 

就用mysize遍佈在那裏你會用floatdouble

您可能對simpleTemplates sample code感興趣,除此之外,還有其他模板化的CUDA示例,其中,作爲talonmies的州,它被廣泛使用。 Thrust還爲C++程序員提供了許多其他好處。

+0

這也可以是一個非常好的選擇,雖然它排除了能夠在同一個編譯單元中使用兩個版本。 – talonmies