我寫一個CUDA內核矩陣的每一個元素上執行一個操作(例如squarerooting每一個元素,或冪,或者計算正弦/餘弦 - 在矩陣上的單個元素的操作如果所有的數字之間[-1; 1],等等。)CUDA - 讓思想
我選擇了塊/線程網格的尺寸,我覺得代碼非常簡單明瞭,但是我問自己什麼...我能做到最大化聚結/ SM佔用率嗎?
我的第一個想法是:從全局內存中加載所有半扭曲(16線程)加載數據集,然後將它們全部加以計算,但它發現沒有足夠的內存傳輸/計算並行化。線程加載數據,然後計算,然後再次加載數據,然後重新計算..這聽起來在性能方面真的很差。
我以爲使用共享內存會很好,也許使用某種地方來使線程加載更多的數據比實際需要其他線程的工作,但這聽起來也很愚蠢,因爲第二個會等待前者在開始工作之前完成數據加載。
我真的不知道我把關於我的問題,我只是開始對一些具體工作之前獲得思想的正確理念。
每個評論/建議/評論家都很受歡迎,謝謝。
不幸的是,我不知道何時這些矩陣(可能從10x10到20.000x20.000不等)將顯示出來計算。我需要編寫的CUDA模塊沒有鏈接到「矩陣生成」代碼(我甚至不知道) – 2011-04-04 14:04:30
在這種情況下,您最好的選擇可能是在代碼中引入一些可調整的大小指標,以便當GPU的計算速度過小,因此您需要使用主機實現。你可以做一些基準測試,並開發一個簡單的執行時間模型,它可以預測哪個是更有效的解決方案。還有一部分工作可以在GPU上完成,部分工作在並行的主機CPU上。我已經非常成功地使用了這個操作,例如gemm等O(N^3)操作。 – talonmies 2011-04-04 14:23:31
@Paul:然後期望在小矩陣上加速並在大矩陣上加速。你是否必須在相同的矩陣上或先前矩陣的結果上按順序計算元素運算?不惜一切代價避免轉移。只是給你一些數字:如果每個元素的計算都不是很大(只是sqrt很小),那麼極限是IO,對於現代DDR3計算機來說,20 GB/s是沒有問題的,即32如果你不在GPU上做更多的計算(在同一個矩陣上進行多次操作),你就不需要任何存儲,但是它會花費你的時間! – flolo 2011-04-04 14:24:54