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