2011-03-06 78 views
3

爲什麼下面的代碼段不適用於CUDA(3.2和4.0)?#define和CUDA

#define NUM_BLOCKS 16 

// lots of code. 

dim3 dimBlock(NUM_BLOCKS, NUM_BLOCKS); 

但這,

dim3 dimBlock(16, 16); 

呢?我不斷收到error : expected a ")"error : expected an expression。我錯過了什麼?

回答

8

你確定你沒有寫

#define NUM_BLOCKS 16; 

(注意最後的分號)?

我得到了你所描述的錯誤,當erroneus分號出現時。

+0

地獄,就是這樣!我滾動瀏覽預處理代碼的頁面和頁面,只能用分號將它們放低!我> doofus。 – 2011-03-06 12:58:27

+0

@Kristian:看到......正如我所說,如果你使用'const int'或'enum'而不是'#define',你就不會遇到這個問題:D – Nawaz 2011-03-06 13:02:37

2

這很奇怪。這可能是因爲宏常見的問題。如果你知道,宏不尊重範圍。這可能是相同的宏定義在其他地方,但不同。

爲什麼不使用const intenum而不是宏?

你知道嗎:C++ - enum vs. const vs. #define

+0

是的,但原則上至少它應該工作,這就是爲什麼我覺得它很奇怪。 – 2011-03-06 12:32:22

+0

@克里斯蒂安:正如我所說,如果有通常的問題,那麼它將如何工作?確保問題不存在,使用宏很困難,這就是爲什麼'const int'或'enum'是首選的原因。 – Nawaz 2011-03-06 12:33:28

+0

你是什麼意思納瓦茲?我嘗試將宏重命名爲明顯由用戶創建的宏。我不明白爲什麼它不應該工作。無論如何,我會盡力在今天晚些時候做到這一點...... – 2011-03-06 12:38:45

1

找到的一種方法是讓您的編譯器驅動程序在預處理階段後停止,以便您可以看到已生成的內容。這將向您顯示預處理器替代的內容,並因此爲您提供搜索的內容。

如果您對MSVC使用gcc和/ E,則選項爲-E。

對於NVCC編譯器驅動程序的典型命令將

nvcc -E file.cu -o file.cup 
+0

我懷疑這與NVCC如何看待預處理器命令有關,因爲這是'.cu'文件? – 2011-03-06 12:33:14

+0

@Kristian D'Amato:我不熟悉CUDA,但是我只是簡單地看了一下nvcc手冊,它說它支持'-E'選項來從.cu文件生成預處理源。我將用示例命令行編輯我的答案。 – Troubadour 2011-03-06 12:45:55