使用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。每次我想改变精度时,我只更改定义而不需要重复代码或遍历整个代码。
有没有正确的方法可以做得更好?
答案 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
};