C_and_CPP 板


LINE

遇到的問題: (題意請描述清楚) 最近剛開始學習CUDA, 照著國網中心的教學寫了個矩陣乘法練習, 出來的結果確在某些元素會有錯, 而且相同的輸入、相同的程式碼情況下, 跑出來的結果確可能是不一樣的(某幾個版本的答案在變動) 這是我輸入的兩個矩陣: M = 1.000000 3.000000 2.000000 0.000000 1.000000 0.000000 2.000000 2.000000 2.000000 0.000000 1.000000 1.000000 1.000000 3.000000 1.000000 3.000000 N = 3.000000 2.000000 3.000000 0.000000 3.000000 0.000000 2.000000 1.000000 0.000000 2.000000 1.000000 0.000000 2.000000 3.000000 3.000000 2.000000 希望得到的正確結果: P = 12.000000 6.000000 11.000000 3.000000 7.000000 12.000000 11.000000 4.000000 8.000000 9.000000 10.000000 2.000000 18.000000 13.000000 19.000000 9.000000 程式跑出來的錯誤結果: 主要就以下幾個版本在變動… P = 12.000000 6.000000 11.000000 3.000000 8.000000 5.000000 11.000000 4.000000 8.000000 5.000000 10.000000 0.000000 9.000000 5.000000 17.000000 5.000000 P = 12.000000 6.000000 11.000000 3.000000 8.000000 5.000000 11.000000 4.000000 8.000000 9.000000 8.000000 3.000000 18.000000 13.000000 5.000000 3.000000 P = 12.000000 6.000000 11.000000 3.000000 8.000000 5.000000 11.000000 4.000000 8.000000 9.000000 10.000000 2.000000 7.000000 4.000000 19.000000 9.000000 P = 12.000000 6.000000 7.000000 6.000000 7.000000 12.000000 7.000000 6.000000 8.000000 9.000000 8.000000 3.000000 18.000000 13.000000 5.000000 3.000000 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) XP - VS2005 GeForce GT 220 - CUDA 2.3 有問題的code: (請善用置底文標色功能) 其實我覺得code應該是沒什麼問題, 但還是將處理資料的那部份貼出來, 也許是我沒寫好 -> // Matrix multiplication dernel - per thread code __global__ void MatrixMulKernel(float* Md, float* Nd, float* Pd, int Width) { // Block ID int bx = blockIdx.x; int by = blockIdx.y; // Thread ID int tx = threadIdx.x; int ty = threadIdx.y; // Pvalue stores the element of the block sub-matrix // that is computed by the thread - automatic variable! float Pvalue = 0; // Loop over all the sub-matrices of M and N // required to compute the block sub-matrix for (int m = 0; m < Width/TILE_WIDTH; ++m) { // Get a pointer to the current sub-matrix Msub of M float *Mdsub = GetSubMatrix(Md, m, by, Width); // Get a pointer to the current sub-matrix Nsub of N float *Ndsub = GetSubMatrix(Nd, bx, m, Width); __shared__ float Mds[TILE_WIDTH][TILE_WIDTH]; __shared__ float Nds[TILE_WIDTH][TILE_WIDTH]; // each thread loads one element of the sub-matrix Mds[ty][tx] = GetMatrixElement(Mdsub, tx, ty, Width); // each thread loads one element of the sub-matrix Nds[ty][tx] = GetMatrixElement(Ndsub, tx, ty, Width); // synchronize to make sure the sub-matrices are loaded // before starting the computation __syncthreads(); // each thread computes one element of the block sub-matrix for (int k = 0; k < TILE_WIDTH; ++k) Pvalue += Mds[ty][k] * Nds[k][tx]; // Synchronize to make sure that the preceding // computation is done before loading two new // sub-matrices of M and N in the next iteration __syncthreads(); } // Get a pointer to the block sub-matrix of P float *Psub = GetSubMatrix(Pd, bx, by, Width); // Write the block sub-matrix to device memory; // each thread wreites one element SetMatrixElement(Psub, tx, ty, Pvalue, Width); } __device__ float* GetSubMatrix(float* Md, int x, int y, int Width) { return (Md + y*TILE_WIDTH*Width + x*TILE_WIDTH); } __device__ float GetMatrixElement(float* Mdsub, int x, int y, int Width) { return *(Mdsub + y*Width + x); } __device__ void SetMatrixElement(float* Psub, int x, int y, float Pvalue, int Width) { *(Psub + y*Width + x) = Pvalue; } 補充說明: 爬過其它文好像有人說過硬體相關也會影響, 但這方面我就不知道要怎麼解決了, 還請大家幫幫忙,謝謝!! --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.22.18.83
1F:→ lgen7604:看起來kernel的部份沒有問題 我測試執行的結果也正確 12/16 11:58
2F:→ lgen7604:要不要考慮用置底文的網站 把完整的code附上來 12/16 11:58
3F:→ lgen7604:比較容易抓出問題出在哪裡 12/16 11:59
4F:推 andyjy12:用emu mode下開debug看看 12/16 13:15
5F:→ caifu:l大 我把code附上來了 http://paste.plurk.com/show/105356/ 12/16 17:23
6F:→ caifu:麻煩了 謝謝 12/16 17:24
7F:推 lgen7604:關於dimension的宣告 dim3 dimBlock(Width, Width); 12/16 19:25
8F:→ lgen7604:請特別小心.. dim3 dimBlock(TILE_WIDTH, TILE_WIDTH); 12/16 19:25
9F:→ caifu:請問這句要特別小心的原因是?! 12/17 12:28
10F:推 lgen7604:因為你矩陣乘法主kernel沒問題 問題是出在dimension宣告 12/17 13:29
11F:→ lgen7604:所以提醒你注意這部份 這種問題通常不容易發現 12/17 13:29
12F:→ caifu:l大 不好意思 這部份我還是沒有很懂 有沒有什麼文章教學呢?! 12/17 21:39
13F:→ caifu:l大 我懂你意思了 程式已改好了 謝謝!! ^^ 12/18 16:41







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP