[問題] 大型矩陣相乘(CUDA)

看板C_and_CPP (C/C++)作者 (年輕的心)時間14年前 (2012/02/28 17:50), 編輯推噓2(2016)
留言18則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++2010, Win7 64位元, CUDA 4.1, Tesla C2050 (Compute Capability:2.0) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 大家好! 小弟想請教一個問題: 有一個矩陣p,大小為7*65536,現在想要用CUDA來實做p乘以p的轉置矩陣,動手以後卻發 現遠比想像中的難,能請各位高手提供小弟一個方向或是具體的做法嗎?小弟感激不盡 ! 之所以會覺得很難的原因,是就小弟的認知,p矩陣要切,才有辦法用CUDA做運算 ,難就難在要怎麼切,以及切了以後要怎麼送進device做運算,還有做完運算以後要怎麼 組合以得到正確的答案。以上,有請各位高手指教! m(_ _)m 餵入的資料(Input): 以下的程式碼是給定p矩陣的初始值: for(i=0;i<7;i++){ for(j=0;j<65536;j++){ if(j/2==0){ p[i][j]=1; } else if(j/7==0){ p[i][j]=2; } else p[i][j]=0; } } 預期的正確結果(Expected Output): 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) p矩陣乘以p的轉置矩陣(未使用CUDA): for(i=0;i<7;i++) { for(j=0;j<7;j++){ for(k=0;k<65536;k++){ q[i][j]+=p[i][k]*p[j][k]; } } } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.240.229.94

02/28 18:46, , 1F
最簡單的方法就是不要自己做.. 矩陣相乘是 CUDA 標準範例
02/28 18:46, 1F

02/28 18:47, , 2F
請找 CUDA 的 Programming guide 和 Tutorial
02/28 18:47, 2F

02/28 18:48, , 3F
原理上是拆成 block
02/28 18:48, 3F

02/28 19:07, , 4F
謝謝樓上,Programming guide 小弟有看過~
02/28 19:07, 4F

02/28 19:09, , 5F
但是每個區塊的最大x維數或y維數有1024的限制呀
02/28 19:09, 5F

02/28 19:10, , 6F
(以Tesla C2050來說)
02/28 19:10, 6F

02/28 19:11, , 7F
這樣子真的不知道該怎麼辦!
02/28 19:11, 7F

02/28 19:14, , 8F
65536遠超過1024
02/28 19:14, 8F

02/28 20:03, , 9F
用gridDim啊
02/28 20:03, 9F

02/28 20:03, , 10F
http://zh.wikipedia.org/wiki/分塊矩陣 (這個?)
02/28 20:03, 10F

02/28 22:02, , 12F
謝謝sunneo和DJWS!
02/28 22:02, 12F

02/28 22:14, , 13F

02/28 22:14, , 14F

02/28 22:15, , 15F

02/28 22:15, , 16F

02/28 22:15, , 17F
出自"GPU之高效能運算CUDA",看看對你有沒有幫助
02/28 22:15, 17F

02/29 11:10, , 18F
嗯!謝謝bugmens!有幫助!
02/29 11:10, 18F
文章代碼(AID): #1FJADEpB (C_and_CPP)
文章代碼(AID): #1FJADEpB (C_and_CPP)