2010-03-04 90 views
1

我試圖減少CUDA內核的指令和常量內存讀取次數。使用宏爲CUDA定義常量

因此,我意識到我可以從常量內存中取出瓦片大小並將它們變成宏。如何定義在預處理期間評估爲常量的宏,以便我可以簡單地調整三個值並減少每個內核中執行的指令數量?

下面是一個例子:

#define TX 8 
#define TY 6 
#define TZ 4 

#define TX2 (TX * 2) 
#define TY2 (TY * 2) 

#define OVER_TX (1.0f/float(TX)) 

也許這已經是這樣了(或者可能由NVCC編譯器處理),但顯然我希望宏的第二塊由預處理器進行評估,而不是替換該代碼使其不在每個內核中執行。有什麼建議麼?

+1

如果您打算使用預處理器定義來執行此操作,則最好將所有內容括起來,因此不要使用「#define TX2 TX * 2」來執行「#define TX2(TX * 2)」。這樣,如果使用常量的地方的操作的優先級等於或高於常量中的操作,那麼您不會收到意外的行爲。正如當前定義的「x/TX2」!=「x /(TX2)」,但如果它導致錯誤,很難找到它。 – asm 2010-03-04 11:29:23

+0

你是完全正確的,編輯了答案。還增加了一個更復雜的例子... – Dan 2010-03-04 11:36:04

回答

2

現代編譯器通常會在編譯時儘可能地評估常量,所以你應該沒問題。對於正確定義的常量也是如此(即使用const而不是「old skool」#define方法)。

+0

好吧,這很符合邏輯。更復雜的結構比如#define(1.0f/float(TX))這對於在運行時不執行更重要嗎? – Dan 2010-03-04 11:34:41

+1

如果TX在編譯時知道,那麼是的,那也應該簡化。對於像這樣的性能關鍵的東西,儘管您應該養成查看編譯器輸出以查看實際生成內容的習慣 - 這可以提供有用的見解,瞭解如何編寫代碼以充分利用編譯器以及可以爲微觀優化提供進一步的想法。 – 2010-03-04 12:39:38