在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功能不可用。
答案 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);