2012-06-24 184 views
0

我有一段代碼,它由沒有修改權限的對象組成。另一方面,我必須編寫CUDA內核來進行一些計算。此刻,我將所需的信息轉換爲數組或結構並傳遞給它。是否有可能將對象傳遞給CUDA內核,並且CUDA內核是否有權訪問該類的私有成員?有些人也向我建議。將C++對象傳遞給CUDA內核

+0

請教[這個答案](http://stackoverflow.com/a/14119245/1593077)到一個相關的問題。 – einpoklum

回答

3

您可以在您的CUDA代碼中使用C++功能。它有一些額外的要求。例如內核函數不能是我的一個類的成員。對於使用你自己的數據結構,它需要符合一些要求。作爲__device__

  • 你需要實現__device__構造函數,你需要在設備代碼中使用

    • 成員應註明。
    • 如果你的結構封裝指針,這需要在設備內存中分配。
    • 您可以使用模板,但不能使用具有虛擬功能的類。

    您可以在編程指南的附錄D. C/C++語言支持中看到C++數據結構的一些示例。

    至於你的具體問題:

    1. 是的,你可以在內核傳遞對象。您需要爲其實施__device__複製構造函數。
    2. 您可以通過班級方法訪問私人成員。您應該使用__device__訪問器方法在課堂外使用它。 但是你不能通過內核調用傳遞具有私有成員的類。
  • +0

    首先感謝您的回答。我仍然對主查詢有疑問。假設我有一個C++類ex: - class A(){private:int x;}。現在,我將這個類的一個對象傳遞給另一個文件中的cuda內核。現在,內核如何訪問私有變量。我必須包含內核的類定義才能理解。但是,然後我得到它是無法訪問的錯誤。如果我在類定義中包含__global__函數(),那麼g ++將無法編譯它。如何去做。 –

    +0

    你能提供一些代碼的例子嗎? – geek

    +0

    我有一個C++文件fil1.c頭文件file.h,它有一個類的定義 - class A {private:int x; void funct();}。在file1.c中實現的funct函數中,我調用了file2.cu中的函數,並說B(),並且我將B的對象objx傳遞給B。現在B()調用cuda內核K <<<1,1000> >>(objxDev )其中objxDev是類A的一個對象,並且在設備端用適當的memcpy進行了連接。問題是,在內核代碼中,我查詢objx.x,並且出現無法訪問的錯誤。我必須賦予這個內核函數訪問私有成員x的權力,並且不需要afftg A級。 –