2012-06-22 115 views
1

我是CUDA編程的新手,並且由於性能原因,我主要使用每塊的共享內存。我的程序現在的結構是這樣的,我使用一個內核來加載共享內存和另一個內核來讀取預加載的共享內存。但據我所知,共享內存不能在兩個不同的內核之間持續存在。持久GPU共享內存

我有兩個解決方案;我不確定第一個,第二個可能會很慢。

第一個解決方案:我使用的是一個內核,而不是使用兩個內核。加載共享內存後,內核可能會等待來自主機的輸入,然後執行該操作,然後將該值返回給主機。我不確定內核是否可以等待來自主機的信號。

第二種解決方案:加載共享內存後,將共享內存值複製到全局內存中。當下一個內核啓動時,將全局內存中的值複製回共享內存,然後執行操作。

請評論兩種解決方案的可行性。

+0

爲什麼啓動內核後需要等待主機輸入? – pQB

+2

這聽起來像你可能試圖將共享內存壓縮到一個並非真正意義上的用法。如果您的目標是計算能力> = 2.0的設備,我會說,首先不要擔心使用共享內存。相反,使用'cudaFuncSetCacheConfig(MyKernel,cudaFuncCachePreferL1)'設置L1緩存的首選項。當您的算法運行時,在CUDA分析器中運行您的應用程序並檢查它是否受內存限制。如果是內存綁定,那麼考慮是否有任何方法可以通過使用共享內存或更有效地使用L1來提高性能。 –

回答

2

我會使用你提出的第一個解決方案的一個變種:正如你已經懷疑,你不能等待內核中的主機輸入 - 但你可以在一個點同步你的內核。只需調用「__syncthreads();」在你的數據加載到共享內存之後在你的內核中。

我不明白你的第二個解決方案:你爲什麼要將數據複製到共享內存中,只是將它複製回第一個內核中的全局內存?或者這第一個內核是否也計算了一些內容在這種情況下,我想它不會幫助將初步結果存儲在共享內存中,我寧願將它們直接存儲在全局內存中(但這可能取決於算法)。