2012-07-02 60 views
6

我有一個用C++編寫的類,它也使用cuda_runtime.h中的一些定義,這是來自名爲ADOL-C的開源項目的一部分,您可以看看here將C++/CUDA類傳遞給PyCUDA的SourceModule

這在我使用CUDA-C時有效,但我想以某種方式在PyCUDA中導入此類,如果有可能的話。因此,我將在內核中使用這個類(不是在'main'中)來定義用於計算函數派生的特定變量。有沒有辦法將這個類傳遞給PyCUDA的SourceModule?

我問了一個類似的問題,但在這裏我想解釋更多一點。因此,有一個解決方案使用nvcc -cubin(感謝talonmies)編譯我的C代碼,然後用driver.module_from_file()導入它,但是,我想使用SourceModule並將這些內核寫入.py文件,所以它可能更加用戶友好。我的例子會是這個樣子:

from pycuda import driver, gpuarray 
from pycuda.compiler import SourceModule 
import pycuda.autoinit 
kernel_code_template=""" 
__global__ void myfunction(float* inx, float* outy, float* outderiv) 
{ 
    //defining thread index 
    ... 
    //declare dependent and independet variables as adoubles 
    //this is a part of my question 
    adtl::adouble y[3]; 
    adtl::adouble x[3]; 
    // ... 
} 
""" 

...這只是一個想法,但SourceModule不會知道什麼是「adouble的」,因爲它們在類定義adoublecuda.h定義的,所以我希望你現在能更好地理解我的問題。有沒有人有我應該從哪裏開始的線索?如果沒有,我將在CUDA-C中編寫這些內核,並使用nvcc -cubin選項。

感謝您的幫助!

回答

6

PyCUDA SourceModule系統實際上只是一種將代碼傳遞到文件中的方法,將nvcc文件編譯爲cubin文件並(可選)將該文件加載到當前CUDA上下文中。 PyCUDA編譯器模塊對CUDA內核語法或代碼一無所知,並且對已編譯的代碼幾乎沒有影響[幾乎限定符是因爲它可以將用戶提交的代碼用extern "C" { }聲明括起來以停止C++符號的修改]。

所以,我們要做什麼,我認爲你是問,你應該只需要一個#include語句無論頭設備代碼提交的字符串的需要,並在通過include_dirs通過Python列表一套合適的搜索路徑 關鍵字選項。如果你這樣做:

from pycuda import driver, gpuarray 
from pycuda.compiler import SourceModule 
import pycuda.autoinit 
kernel_code_template=""" 

#include "adoublecuda.h" 
__global__ void myfunction(float* inx, float* outy, float* outderiv) 
{ 
    //defining thread index 
    ... 
    //declare dependent and independet variables as adoubles 
    //this is a part of my question 
    adtl::adouble y[3]; 
    adtl::adouble x[3]; 
    // ... 
} 

""" 

module = SourceModule(kernel_code_template, include_dirs=['path/to/adoublecuda']) 

它應該自動工作(注意未經測試,使用風險自負)。

+0

哇,這就是我一直在尋找的解決方案!我只是想包含這個頭文件,以便我的內核知道adouble類的定義在哪裏,但我不知道如何。我不會在「main」中使用這個adouble類,但是我需要弄清楚如何從gpu獲得這個adouble數組。正如你所看到的,adouble類只有兩個私有成員: 'double val' 'double ADVAL' 也許我需要在python中創建一個類似於這個的結構體。非常感謝你幫助我! – Banana

+0

當我試圖包含這個類時,我得到了太多的錯誤:「這個聲明可能沒有extern」C「鏈接」。我需要更改adoublecuda.h還是有其他的東西? – Banana

+0

正如我在我的回答中指出的那樣,SourceModule可以使用'extern「C」{}'聲明括住代碼字符串。在你的代碼中使用純粹的C++定義,你不需要它。您可以使用'no_extern_c = True'關鍵字參數禁用該行爲。輸出中會有符號混亂,您可能需要在Python代碼中使用它。我目前沒有正在運行的PyCUDA安裝來測試。 – talonmies