簡體   English   中英

如何在PyCUDA中使用預處理器符號?

[英]How to use preprocessor symbols in PyCUDA?

有一個用C語言編寫的程序,帶有一些CUDA內核,我需要修改該程序以使用PyCUDA在python中運行。 現在,在此C代碼中,定義了一些全局變量,並且其中一些內核正在通過#ifdef訪問這些變量。 我想做的是在python中定義這些全局變量,然后僅復制我的CUDA C內核代碼並使用SourceModule方案運行它們(假設我只是懶惰)。 我想象這樣的事情:

my_global_var=True
mod=SourceModule(""" __global__ void func() {
...
#ifdef my_global_var
do something
#endif }
""")

有什么辦法嗎? 顯然,這種幼稚的嘗試根本行不通。 我應該使用某種特殊的指針還是類似的東西? 換句話說,當用PyCUDA編譯的CUDA C內核中包含#ifdef時,會發生什么?

編輯:嗯,可能是我在這里誤用了“全局變量”一詞。 C代碼大致如下所示:

#define X
__global__ void func(...) {
...
#ifdef X
do something
#endif }

我想要達到的目的是在PyCUDA中使用該C代碼,而又不會對其造成太多混亂。 因此,我想只復制“ global_ void func ...”,將其放在PyCUDA SourceModule中,然后在python中定義X(無論它是全局變量還是其他變量),就像在第一個偽代碼中一樣。 可能嗎?

與編譯任何C或C ++代碼一樣,預處理器符號的外部操縱(我的意思是在代碼本身之外)需要將其他參數傳遞給編譯器。 如果您有以下代碼:

__global__ void func(...) {
...
#ifdef X
do something
#endif 

}

那么在編譯過程中設置X的方法是將-DX傳遞給編譯器,該編譯器在當前預處理器過程中定義符號X

通過使用SourceModule構造函數中的options關鍵字將選項傳遞給構建,您可以在PyCUDA中完成完全相同的操作。 編譯器選項作為列表傳遞,因此您的PyCUDA示例可以這樣實現:

my_global_var=True

....

build_options = []
if my_global_var:
    build_options.append('-Dmy_global_var')

mod=SourceModule(""" __global__ void func() {
...
#ifdef my_global_var
do something
#endif }
""", options=build_options)

[免責聲明:未經測試,使用風險自負-我沒有正在運行的PyCUDA安裝ATM]

在這里,我們僅構建一個列表,其中包含與傳遞給編譯器所需的選項一樣多的條目,然后使用這些選項實例化SourceModule實例。 在那之后,它應該可以工作了...

暫無
暫無

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

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