簡體   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