[請益] 關於CUDA程式碼的問題...求救...
※ [本文轉錄自 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的情況才對...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.222.76
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.222.76
推
09/18 01:07, , 1F
09/18 01:07, 1F
已經註解了
如果有其他問題歡迎發問
還是不知道出現重複數值的原因...
※ 編輯: blackwindy 來自: 140.123.222.76 (09/18 03:24)
→
09/18 05:42, , 2F
09/18 05:42, 2F
→
09/18 16:48, , 3F
09/18 16:48, 3F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章