在cuda中使用静态成员函数模板结构的替代方法?

时间:2013-11-19 13:56:04

标签: c++ templates c++11 cuda

在C ++中,我经常使用封装在模板结构中的静态函数,以便能够在编译时指定函数模板,从而允许进行各种优化,例如:内联等(顺便说一句,这有名字吗?)。示例(非常做作,可能有错误,但你明白了):

template <int dim>
struct ImplementationA {
    static float compute(float a) {
        // do stuff, e.g.
        return 2*pow(a,dim);
    }
};

template <int dim>
struct ImplementationB {
    static float compute(float a) {
        // do other stuff, e.g.
        return 3*pow(a,dim);
    }
};

template <template <int> class ImplT, int dim> class Test {
    void compute_stuff(float *dst, const float *src, int N) {
        for(int i=0; i<N; i++)
            dst[i] = ImlT<dim>::compute(src[i]);
    }
};

void main() {
    float v1[100];
    float v2[100];

    Test<ImplementationB,3> t;
    t.compute_stuff(v2,v1,N);
}

但是,如果我想在CUDA中做同样的事情,compute是一个内核,即__global__,那么就不可能有一个static __global__成员函数。我还有哪些其他可能性可以提供相同的最小性能开销?我使用GCC 4.6,因此一些C ++ 11功能不可用。

1 个答案:

答案 0 :(得分:1)

您可以使用__device__方法和小模板__global__函数创建一个模板类,该函数只使用此类并调用方法:

template <int dim> class ImplementationA
{
public:
    // parameters
    float *dst;
    const float *src;
    int N;

    // implementation
    __device__ void compute()
    {
        float a = src[threadIdx.x];
        // ...
    }
};

// The same for ImplementationB

// global function
template <class Impl>
__global__ void compute(Impl impl)
{
    impl.compute();
}

// call
ImplementationA<3> impl;
impl.src = src;
compute<<<1, 32>>>(impl);