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

看板C_and_CPP (C/C++)作者 (黑色的風)時間16年前 (2009/09/17 23:43), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串1/2 (看更多)
※ [本文轉錄自 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
會不會是k的問題?!
09/18 05:42, 2F

09/18 16:48, , 3F
會不會是換到另外一條數字的值?
09/18 16:48, 3F
文章代碼(AID): #1AibaLH0 (C_and_CPP)
文章代碼(AID): #1AibaLH0 (C_and_CPP)