我有一個用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選項。
感謝您的幫助!
哇,這就是我一直在尋找的解決方案!我只是想包含這個頭文件,以便我的內核知道adouble類的定義在哪裏,但我不知道如何。我不會在「main」中使用這個adouble類,但是我需要弄清楚如何從gpu獲得這個adouble數組。正如你所看到的,adouble類只有兩個私有成員: 'double val' 'double ADVAL' 也許我需要在python中創建一個類似於這個的結構體。非常感謝你幫助我! – Banana
當我試圖包含這個類時,我得到了太多的錯誤:「這個聲明可能沒有extern」C「鏈接」。我需要更改adoublecuda.h還是有其他的東西? – Banana
正如我在我的回答中指出的那樣,SourceModule可以使用'extern「C」{}'聲明括住代碼字符串。在你的代碼中使用純粹的C++定義,你不需要它。您可以使用'no_extern_c = True'關鍵字參數禁用該行爲。輸出中會有符號混亂,您可能需要在Python代碼中使用它。我目前沒有正在運行的PyCUDA安裝來測試。 – talonmies