Re: [請益] 關於CUDA程式碼的問題...求救...

看板C_and_CPP (C/C++)作者 (晃阿晃阿)時間16年前 (2009/09/18 10:08), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《blackwindy (黑色的風)》之銘言: : ※ [本文轉錄自 VideoCard 看板] : 作者: blackwindy (黑色的風) 看板: VideoCard : 標題: [請益] 關於CUDA程式碼的問題...求救... : 時間: Thu Sep 17 22:48:04 2009 : 目標是做出N長度的數字串,亂數排序且不重複 : 已經有成功做出亂數表跟正常排序的數字串了 : 舉個例子來說,現在是希望將 : 1 2 3 4 5 : 1 2 3 4 5 : 1 2 3 4 5 : 上面這3條字串亂數排序變成 : 2 1 5 4 3 : 5 4 1 3 2 : 4 2 5 1 3 : 參考了a5000ml大大的泡泡排序寫出下面的CODE,希望做出亂數排序的效果 : 演算法的差別主要是在於判別swap的機率為取亂數表決定(50%機率交換) : //string_number: 有string_number個字串要作亂數排序 : for(int i = blockIdx.x; i < string_number; i += gridDim.x) : //lenth: 表示單一字串的長度,每條字串都一樣長 : for(int loop=0; loop <= lenth/2; loop++) : for(int j = threadIdx.x, k = 2 * threadIdx.x; j < lenth : ; j += blockDim.x){ : //0 based 配對資料 (0,1) (2,3) (4,5) .... : //randtable為1個我預先建立好的亂數表 : //這邊只是去表中取個亂數並且mod 2 ,也就是下面的判斷式有50%的機率會成立 : if(randtable[loop * i * lenth + i * lenth + j] % 2 == 0) : //若成立時將string中的2個作swap : //這邊的string是用1維模擬2維,因此需要用i * lenth算出index再加k : //換個說法就是s[index][k] : swap(string[i * lenth + k],string[i * lenth + k + 1]); : //1 based 配對資料 (1,2) (3,4) (5,6) .... : //randtable 等同上 : if(randtable[loop * i * lenth + i * lenth + j] % 2 == 0) : if(k < lenth-2) //若 N 為偶數時, 最後一個執行緒不作用 : swap(string[i * lenth + k + 1],string[i * lenth + k + : 2\ : ]); : } : 現在問題是不知道為什麼執行完以後裡面的數值會出現重複的情況 : 例如 : 1 1 5 3 2 : 看起來應該沒有race condition的情況才對... 其實我最大的疑問是在 gridDim.x blockIdx.x threadIdx.x 這幾個變數XD 我猜一個有可能的發生原因 因為是用一維模擬二維 是不是有這個機會把上一個數列的最後一個數跟下一個數列的第一個數對換了 像是這樣 5 2 4 3 1 2 1 3 5 4 └─┘ 對換 導致某個數列有重複兩個數 變這樣 5 2 4 3 2 1 1 3 5 4 我看不太出來 只是猜而已^^|| -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.216.142
文章代碼(AID): #1Aikkqpv (C_and_CPP)
文章代碼(AID): #1Aikkqpv (C_and_CPP)