我有一段C ++ CUDA代码,我必须在float中声明数据变量。我还必须重写声明数据变量为double的代码。
在CUDA中处理这种情况的好设计是什么?
我不想拥有两组相同的代码,因为在将来任何更改我将不得不更改两组相同的代码。我还希望保持代码干净而不需要太多#ifdef
来在代码中的float和double之间进行更改。
任何人都可以建议任何好的(在维护和“易于阅读”方面)设计吗?
答案 0 :(得分: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工具包的所有最新版本一起提供,广泛使用此工具来实现类型不可知算法。
答案 1 :(得分:2)
除了模板,你可以用一个typedef实现你想要的东西:
typedef float mysize; // or double
然后在您使用mysize
或float
的地方使用double
。
你可能对simpleTemplates sample code感兴趣,还有其他模板化的CUDA例子,除了thrust之外,正如talonmies所述,它被广泛使用。 Thrust为C ++程序员提供了许多其他好处。