如何使用模板或typedef在float / double矢量类型之间进行选择?

时间:2013-07-24 10:21:17

标签: cuda

通过typedefs

来定位不同浮点精度(float / double)的常用方法
typedef float Real;
//typedef double Real;

或使用模板

template<typename Real>
...

这很方便,但是任何人都有想法如何使用CUDA类型float2 / float3 / ...和make_float2 / make_float3 / ...?当然,我可以为所有人制作#defines或typedef,但这看起来不是很优雅。

1 个答案:

答案 0 :(得分:5)

您可以实现将连接类型和通道编号的辅助类:

template <typename T, int cn> struct MakeVec;
template <> struct MakeVec<float, 3>
{
    typedef float3 type;
};
template <> struct MakeVec<double, 3>
{
    typedef double3 type;
};
// and so on for all combination of T and cn

用法:

template <typename T>
void func()
{
    typedef typename MakeVec<T, 4>::type vec4_type;
    vec4_type vec4; // for T=float it will be float4, for T=double it will be double4
}

您可以找到实施here