我有一塊C++ CUDA代碼,我必須寫出以float形式聲明數據變量。我還必須重寫用double聲明數據變量的代碼。用於CUDA代碼的C++設計
在CUDA中處理這種情況的好設計是什麼?
我不想有兩組相同的代碼,因爲那麼在將來任何更改時,我將不得不更改兩組其他代碼。我也想保持代碼清潔,不用太多的#ifdef
在代碼中的float和double之間切換。
任何人都可以請建議任何好(在維護和「易於閱讀」)設計?
我有一塊C++ CUDA代碼,我必須寫出以float形式聲明數據變量。我還必須重寫用double聲明數據變量的代碼。用於CUDA代碼的C++設計
在CUDA中處理這種情況的好設計是什麼?
我不想有兩組相同的代碼,因爲那麼在將來任何更改時,我將不得不更改兩組其他代碼。我也想保持代碼清潔,不用太多的#ifdef
在代碼中的float和double之間切換。
任何人都可以請建議任何好(在維護和「易於閱讀」)設計?
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工具包的所有最新版本一起提供,廣泛使用該工具來實現類型不可知的算法。
除了模板,你可以達到你想要什麼用單一的typedef:
typedef float mysize; // or double
就用mysize
遍佈在那裏你會用float
或double
。
您可能對simpleTemplates sample code感興趣,除此之外,還有其他模板化的CUDA示例,其中,作爲talonmies的州,它被廣泛使用。 Thrust還爲C++程序員提供了許多其他好處。
這也可以是一個非常好的選擇,雖然它排除了能夠在同一個編譯單元中使用兩個版本。 – talonmies
哇!我不知道這存在。非常感謝你。有沒有我可以看的任何教程類文檔。 – user1612986
在編程指南的附錄中簡要討論了CUDA中支持的C++特性。 – talonmies
另請參閱[這個問題](http://stackoverflow.com/a/6179580/681865)另一個非常有用的基於模板的CUDA設計模式。 – talonmies