2013-07-30 83 views
0

我有一個AMD GPU,我想實現'矩陣轉置'的例子。想象一下,兩個方案的實施:OpenCL - 本地內存效率

1)從全局內存(當前位置)

  • 寫入全局存儲器(目標位置)

  • 2)閱讀

      • 從全局存儲器讀取(當前位置)

      • 寫入本地內存

      • 閱讀從本地存儲器

      • 寫入全局存儲器(目標位置)

      假設我已經爲這兩種解決方案選擇了最佳的工作組規模。 順便說一句,第二個算法利用協作寫入本地內存。

      最後,令人驚訝的是第二種情況的結果是第一種情況的兩倍。我只是不明白爲什麼?

      我可以看到,在第一個中我們有1個讀取和1個寫入和到全局內存,在第二個,除了全局內存操作,我們有1個讀取和1個寫入和到本地記憶,它怎麼會更快?

      如果有人在這種情況下幫助我,我會很高興。

      預先感謝您:-)

    回答

    1

    我有一個AMD GPU和我想要實現「矩陣轉置」的例子。

    (以防萬一你不知道,NVIDIA SDK包含OpenCL的矩陣乘法例子(或許AMD APP也有一個),這樣你就可以在以後你的代碼與他們進行比較。)

    第一個變種將不可避免地從連續的工作項中讀取或寫入具有非順序存儲器位置的矩陣元素。這意味着每個這樣的訪問都必須單獨執行,並且由於全局內存訪問具有嚴重的延遲,所以會減慢代碼的速度。

    第二個變體利用稱爲合併的特徵。視頻卡驅動程序可以將多個內存請求從順序工作項目連接到順序存儲器位置(有一些細微差別,詳情請參閱編程指南)並寫入一個大請求,並且一次讀取8個浮動內容。所以,而不是8個長的請求,你只有一個,這會顯着提高性能。

    但是在矩陣乘法算法中,爲了使您的全局內存訪問順序化,您在一個工作項目中處理的數據片段必須由另一個項目存儲。這就是爲什麼您必須使用本地內存 - 填充它,同步工作組,然後將其內容存儲到全局內存 - 但是順序不同,以便存儲過程是順序的。是的,它涉及對本地內存的一些額外讀/寫操作,但是這些延遲要少得多,所以如果你合併了足夠的全局內存操作,那麼你就是整體獲勝。