繁体   English   中英

CUDA模板内核包装器

[英]CUDA template kernel wrapper

我开始编写模拟并决定尝试使用更加反对的方法。 因此,我还决定在CUDA内核中使用模板参数,该参数指示模拟的空间维度。 问题是,由于在头文件中实现模板函数的限制,我不得不使用一种复杂的方法来保持内核包装器可以从.cpp源文件调用。

我的方法是重载2和3维的包装函数。 然后我有一个包装类的类,它处理初始化和管理内核资源。 不幸的是,由于我提到的限制,我必须保留两个成员用于模板类,即


struct kernelWrapper{
    KernelWrapper(Simulation&lt2> *simulation):
        d_(2),
        simulation2d_(simulation)
    {}
    KernelWrapper(Simulation&lt3> *simulation):
        d_(3),
        simulation3d_(simulation)
    {}
    process(void){ //wrapper function for kernel launching
        switch(d_){
        case 2:
            kernel&lt2><<<..., ...>>>(...);
            break;
        }
        case 3:
            kernel&lt3><<<..., ...>>>(...);
            break;
        }
        default:
            break;
    }

    int d_;
    union{
        Simulation&lt2> *simulation2d_;
        Simulation&lt3> *simulation3d_;
    };
    union{
        Lattice&lt2> *lattice2d_d;
        Lattice&lt3> *lattice3d_d;
    };

};

因此,我想知道你是否知道一种更好的方法来实现我正在尝试做的事情,即为模板CUDA内核创建一个包装器。

更新:我想在上面的帖子后添加一个我发现的解决方案。 正如C ++ faq (第13-15点)所示,可以将模板实现放在源文件中并显式实例化所需的模板,即在我的情况下为2和3维。 使用C ++ 11,可以更进一步,在模板定义中引入关键字extern以节省一些编译/链接时间, 这里也会进行解释。

问题是,由于在头文件中实现模板函数的限制,我不得不使用一种复杂的方法来保持内核包装器可以从.cpp源文件调用。

在.cpp中编写模板声明代码是合法的

无论kernelWrapper是在.hpp还是.cpp,你都应该有一个看起来像的代码

template<int d_>
struct kernelWrapper
{
    KernelWrapper(Simulation<d_> *simulation) : simulation_(simulation)
    {}

    process(void)
    {
            kernel<d_><<<..., ...>>>(...);
    }

    Simulation<d_>* simulation_;
    Lattice<d_>*    lattice2d_;
};

还要避免使用switch / case来选择内核,使用如下内容:

int const max_dimension = 4;

template<int static_dimension>
void select_kernel(int dynamic_dimension)
{
    if(dynamic_dimension == static_dimension)
    {
        call_kernel<static_dimension>();
    }
    select_kernel<static_dimension+1>(dynamic_dimension);
}

template<>
void select_kernel<max_dimension>(int dynamic_dimension)
{
    // error message
}

void select_kernel(int dynamic_dimension)
{
    select_kernel<1>(dynamic_dimension);
}

如果这种选择很频繁,那么不使用模板会很有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM