簡體   English   中英

CUDA和課程

[英]CUDA and Classes

我一直在搜索有關如何使用CUDA的類的一些見解,雖然人們普遍認為它可以完成並且顯然是由人完成,但我很難找到實際的方法。做到這一點。

我有一個類,它通過運算符重載等實現基本的bitset。 我需要能夠在主機和設備上實例化此類的對象,在兩者之間進行復制等。我是否在.cu中定義了這個類? 如果是這樣,我如何在我的主機端C ++代碼中使用它? 該類的函數不需要訪問特殊的CUDA變量,如threadId; 它只需要能夠用於主機和設備端。

感謝您的幫助,如果我以完全錯誤的方式接近這一點,我很想聽聽替代方案。

在#include的頭文件中定義類,就像在C ++中一樣。

必須使用__device____host__ declspecs定義必須從設備代碼調用的任何方法,包括構造函數和析構函數(如果您計划在設備上使用new / delete (注意new / delete需要CUDA 4.0和計算能力2.0或更高版本) GPU)。

您可能想要定義一個宏

#ifdef __CUDACC__
#define CUDA_CALLABLE_MEMBER __host__ __device__
#else
#define CUDA_CALLABLE_MEMBER
#endif 

然后在您的成員函數上使用此宏

class Foo {
public:
    CUDA_CALLABLE_MEMBER Foo() {}
    CUDA_CALLABLE_MEMBER ~Foo() {}
    CUDA_CALLABLE_MEMBER void aMethod() {}
};

原因是只有CUDA編譯器知道__device____host__ - 您的主機C ++編譯器將引發錯誤。

編輯:注意__CUDACC__由NVCC在編譯CUDA文件時定義 這可以在使用NVCC編譯.cu文件時,也可以在使用命令行選項-x cu編譯任何文件時使用。

這個問題的另一個好資源是CUDA工具包附帶的一些代碼示例。 在這些代碼示例中,您可以找到幾乎可以想象的任何事物的示例。 與您的問題相關的是quadtree.cu文件。 祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM