在cuda中,一般的資料複製到的顯示卡記憶體的部分,稱為global memory。這些記憶體時沒有cache 的,而且,訪問global memory所需要的時間(即latency)是非常長的,通常是數百個cycles. 如果我們的程式只有乙個thread,所以每次它讀取global memory的內容,就要等到實際讀取到資料、累加到sum之後,才能進行下一步,這就是為什麼如果採取乙個執行緒搞的話表現會很差。
由於global memory並沒有cache,所以要避免開巨大的latency的方法,就是要利用大量的threads。假設現在又大量的threads在同時執行,那麼當乙個thread讀取記憶體,開始等待結果的時候,gpu就可以立刻切換到下乙個thread,並讀取下乙個記憶體位置。因此,理想上當thread的數目夠多的時候,就可以完全把global memory的巨大latency隱藏起來了。
想一下如果把計算平方和的程式並行換額?其中的乙個比較好的方法是把數字分成若干組,把各組數字分別計算平方和後,最好再把每組的和加總起來就可以了,所以,一開始,我們可以把最後加總的動作,由cpu來進行。
現有一kernel函式__global__ static void sumofquery(int*, int* clock_t*)
n 第一種方法「偽多執行緒法」
即在主函式中呼叫<<<1, 1, 0>>>sumofquery(…)
即採用乙個block 乙個執行緒 序列實現。
for (int i= 0, i < element_size; ++i)
sum += elem[i]
n 第二種採用多執行緒法
即在主函式中呼叫<<<1, thread_size, 0>>>sumofquery
sum += result[i] (i從0到thread_size) //host
for (i = tid * size; i < (tid + 1) * size; ++i) //kernel
存在缺點為記憶體延遲大,因為當第乙個執行緒等到記憶體資料時,第二個執行緒就開始執行,所以資料沒有成塊。
n 第三種採用改進型多執行緒法
size = data_size / thread_num
for (i = tid; i < data_size; i += thread_num)
result[tid] = sum;
此種方法的採用的很大一部分原因在於顯示卡上的記憶體是dram,因此基於它的操作(最有效的訪問方式)是以連續的方式訪問。上乙個程式中,雖然表面看起來是連續儲存記憶體位置,但是在實際上是與想法違背的。
實驗結果發現雖然latency有所減少,但沒有取得明顯效果,主要原因在於thread數目較小,即n個thread最多只能隱藏n個latency。所以,如果增加thread數目,就可以看到更好的效率,例如可以把thread的數量調的更高,但不能超過gpu所能執行的最大執行緒數目。
失之東隅收之桑榆,thread數目過多,同樣會導致cpu端的工作也可能家走。
n 第四種是採用塊的形式
即新增block塊,在cuda中,thread是可以分組的,乙個block中的thread,具有乙個共享的share memory,也可以進行同步工作。不同block之間的thread則不行,在計算平方和這個專案中,則並不太需要進行thread的同步動作,因此我們可以使用多個block來進一步增加thread的數目。
for (i = bid * thread_num + tid; i < data_size;
i += block_num * thread_num)
sum += num[i] * num[i];
result[bid * thread_num + tid] = sum;
n 第五種是採取塊內同步演算法與樹狀演算法,正在看中
找工作總結
算一算,從2008年9月份開始找工作,到2009年12月現在已經有3個月了 找工作,算是人生一段特殊的經歷吧,知道了很多公司,認識了很多人,也學習到了很多東西,對這個社會也認識的更清楚了。從一開始的自信,以為很多崗位都是為自己量身打造,卻一次次被bs,讓我很受打擊。特別是幾個好公司的筆試都沒有通過,...
2011工作總結
1 編碼能力 實踐中,開始注重模型的概念。所謂模型打個比方 要做一台電視機,首先搞清楚你想怎麼使用它,目的是讓它看起來更方便易用。根據常規經驗判斷,電器需要電源 需要訊號,這兩點是必不可少。ok,那畫個草圖,電視要顯示,那我給它準備乙個顯示的東西,現實生活中,有以下標準可選 液晶顯示器,投影顯示器 ...
周工作總結
這週前半周開始看了下linux基本命令和shell的相關東西,有了個大概直觀的了解。看書心理依舊是急躁和不安,因為沒有幹具體活,覺得同事們都聽忙碌,我卻閒著看書。於是週三開始幹活,download小工具,fix bug 5579.bug用了一下午找,不敢改動,畏畏縮縮不能動手。然後第二天早晨終於鼓起...