如何正确避免CUDA中单/双精度的复制粘贴方法

时间:2015-01-05 12:30:25

标签: c++ cuda refactoring

使用CUDA时,我经常会比较单精度和双精度(浮点/双精度)的执行时间。为了避免复制粘贴方法,我经常在标准情况下使用模板在float和double之间切换。

当我必须使用来自cusparse / cublas库的方法的extern方法时,问题就开始了。在这种特殊情况下,您有例如:

cublasSaxpy() // single precision
cublasDaxpy() // double precision

如果懒惰,最简单的解决方案是复制粘贴方法

myFloatMethod(float var)
{
    // do stuff in float
    cublasSaxpy(var);
}

myDoubleMethod(double var)
{
    // do stuff in double
    cublasDaxpy(var);
}

我已经尝试搜索此问题,我找到的唯一解决方案是全局定义这样的方法:

#define cublasTaxpy cublasSaxpy // or cublasDaxpy
#define DATATYPE float // or double

并使用cublasTaxpy而不是cublasSaxpy / cublasDaxpy。每次我想改变精度时,我只更改定义而不需要重复代码或遍历整个代码。

有没有正确的方法可以做得更好?

1 个答案:

答案 0 :(得分:4)

您可以为cublasTaxpy()

创建重载,而不是宏
void cublasTaxpy(float f) { cublasSaxpy(f); }
void cublasTaxpy(double d) { cublasDaxpy(d); }

或将整个函数集包装在专门的struct中:

template<typename FLOAT> struct helper_cublas;

template<> struct helper_cublas<float> {
    static void cublasTaxpy(float f) { cublasSaxpy(f); }
    // other functions    
};

template<> struct helper_cublas<double> {
    static void cublasTaxpy(double d) { cublasDaxpy(d); }
    // other functions    
};