2013-01-08 40 views
1

例如,如果你有一個簡單的常數變量__device__ __constant__ int MY_CONSTANT;,它是由相同的內核線程多次訪問:有沒有性能優勢,以複製CUDA C __constant__變量本地內存

__global__ void move(int* dataA, int* dataB, int* dataC){ 
    ... 
    dataB[threadID] = dataA[threadID] * MY_CONSTANT; 
    dataC[threadID] = dataA[[threadID] * dataB[threadID] % MY_CONSTANT; 
    ... 
} 

我可以看到,將局部變量/寄存器中的值dataA[threadID]dataA[threadID] * MY_CONSTANT存儲起來以避免不必要的全局讀取會是有益的。忽略這一點,將MY_CONSTANT的值放置在局部變量中以避免它被讀取兩次,或者編譯器會處理這個值,因爲它不能改變,這與其他全局數據不同。

回答

1

知道的唯一方法,是肯定的,就是它每路碼起來,做到以下幾點:

  1. 生成並檢查PTX代碼,以確定哪些編譯器發出的每個實施。
  2. 儀器和配置文件的每個實施和使用代表性輸入的測試性能。

你在問什麼是那種保證「過早優化」這個短語的微型優化。我的建議是,除非您發現性能不足以滿足您的需求,否則您會忘記此類優化。這就是說,常量內存被存儲在全局內存空間中,當被多處理器訪問時,它會被添加到高速緩存中。隨後訪問此內存區域的延遲要低得多。當一個warp中的所有線程都訪問同一個恆定內存的單詞時,就沒有衝突,而且所有事情都發生得相當快(注意,硬件差別很大,我說的可能在技術上對您的設備來說並不準確,但是外賣是這樣的:按照內存類型的訪問模式,你不需要擔心你在這裏問的東西)。

+0

謝謝。我會試一試。我懷疑它會對上面的例子沒什麼影響,但是如果緩存被更多地使用,它可能會用更復雜的內核。 – Jools

相關問題