[英]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.