C_and_CPP 板


LINE

※ 引述《tmbyksdG (雨神妹妹的男朋友)》之銘言: : 開發平台(Platform): (Ex: Win10, Linux, ...) : Linux上安裝CUDA環境 (CUDA版本為8.0 運算能力為3.7)(Tesla K80) : 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) : NVCC : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 問題(Question): : 硬體方面: : 1.我執行deviceQuery偵測到2個device(device0:Tesla K80, device1:K80),估狗發現K80 : 是由兩個GK210核心所組成,那我偵測到的device是指有兩個K80(4個GK210)的意思嗎? : 還是偵測到的兩個device其實就是GK210? : 2.13個SMX,總共有2496個cores,所以我一次可以同時做運算的數量是否為2496個threads? : 軟體方面: : 我寫了一個64 * 64的矩陣乘法,我想測試不同的block & thread數量去做運算,哪個執 : 行時間會比較短,我試了兩種block的配置(thread數量剛好為4096,一個thread執行一 : 個輸出矩陣的一個element)。 : (1)dim3 dimBlock(32, 32); : dim3 dimGrid(2, 2); : 這個配置是以下附的程式碼配置,執行結果是正常的。 : (2)dim3 dimBlock(4, 128); : dim3 dimGrid(1, 8); : 換成這樣配置編譯之後,結果卻只有大約三分之一是正常的值,其餘卻都是0 : ,我的threadIdx.x & threadIdx.y都是由0-1023,請問這是發生了什麼錯誤嗎? : 另外,我想知道執行運算時thread做了什麼事情,每個thread裡面裝的是什麼東西呢,是 : 我輸入的資料嗎?還是加跟乘這兩個指令呢? : 餵入的資料(Input): : : ... : : 補充說明(Supplement): : 請版上的各位先進指導一下我,謝謝。另外,手機排版請見諒。 原文的code恕刪 小弟剛好也在玩cuda,所以來試試看是不是能幫助到原Po,版上高手如雲,還請多指教。 硬體部分的問題恕在下駑頓...(被巴頭,不過你說的顯卡上總共有幾個core, 同時就可以有幾個執行緒在執行這件事情是對的,不過要看你的 Grid, Block 參數 怎麼下,這個部分你必須先從你的顯示卡的計算能力開始了解起,關鍵字:Warp。 如果參數下歪了,可能就會有一小段時間會有幾個 core 在閒置,當然每台機器 最適合的參數都不一樣,我自己也是還在摸索這個部分,這是我目前理解到的程度, ,如果有錯誤的地方還請高手指點。 再來軟體方面我就熟悉多了,cuda真的是很困難debug,在下常常被indexing搞的 不要不要的。首先呢,你說你的 threadIdx.x, threadIdx.y 都是從 0 - 1023,這是 一個大問題,先假設你沒有筆誤,讓我們來算算看,一個 Block 總共的 thread 數目 最多是 1024 (這個部分我不確定你的機器是否一樣,所以你最好先了解一下),好 一般可以把一個 Block 想像成一個三維陣列的 thread,所以一個 Block 總共會有的 thread 數目是 x * y * z (x, y, z)各代表一個維度的執行緒總數,我們把你的 例子套進來,1024 * 1024 * 1,阿搭,這不是就爆了嗎。所以你要確定你的 threadIdx 的 range到底是多少到多少。 再來你說你的輸出有些值對,有些值不對,哈哈哈~哈威(再度被巴,這個問題 有好幾種可能,第一,可能你從頭到尾所有的 thread 只改到 output array 的其中 一部分,所以剩下的部份當然就是0啦,第二種可能,你某些的 Block access 了他 可以用的 memory 但是有些 Block 卻沒有(以為我又要唱歌了嗎 威。這個狀況下 除了你從 code 一行一行去檢查之外,還有一個不錯用的方式,不過我很好奇,既然 你都會用 cudaEvent_t 了,怎麼不會用這個: cudaError_t,這位大大就是你找錯 的好夥伴,實作部分如下: cudaError_t status; MyKernel<<< grd, blk >>>( ... ); // 你的名字(X 你的kernel(O status = cudaGetLastError(); // 問問 cuda 大大我剛剛有沒有做錯什麼 if( status != cudaSuccess ){ // 如果我有做錯 請告訴我錯在哪 cout << cudaGetErrorName( status ) << ":" << cudaGetErrorString( status ); // exit(255); // 看個人決定要不要繼續執行啦 } 使用上大致就是這樣,我個人是會省去 cudaGetErrorName() 的部份,因為我比較懶惰, 原Po可以自己去玩玩看,在決定要怎麼使用,你有你自己的style。 這應該是第三個問題吧,想知道每個 thread 做了什麼,建議妳自己玩玩看這個, 寫一個 kernel 處理一個大小為 1024 的 array,然後只使用一個 Block 來玩,參數 就可以這樣下 <<< 1, blk >>>, blk 可以是 1 - 1024 任何的數字。然後在裡面讓一 個 thread 只改一個 array element,array index 依據 threadIdx.x。這樣你要他 做什麼都可以,最後把它輸出出來自己看看就知道啦。劇透一下每個 thread 其實都 會執行你 kernel 的內容,不同的地方只在於 threadIdx, blockIdx 這些變數的值會 不一樣。 回答的有點簡略,不過希望能夠幫到你。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.122.248
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1480757935.A.833.html
1F:→ opl164: 一個block內的thread最多是1024個 可是max dimension of 12/04 20:41
2F:→ opl164: a thread block是(1024,1024,64) 為什麼會這樣? 12/04 20:42
3F:→ sunneo: 那只是在表示x,y,z個別的最大值,但仍得保持x*y*z<1024 12/04 21:00







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燈, 水草

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

TOP