看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《ofd168 (大色狼來襲)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC++ : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : CUDA : 問題(Question): : 由於專題需要 自學CUDA : 但是遇到一些困擾 : 1. 一個block最多只能512個thread : 所以如果要更多thread 需要用多block : 可是 grid呢? 為何還需要分grid? 想像一個 thread 是一個人 一個 block 就是一個家庭 許多人組成一個家庭 你開一間餐廳(grid) 一次一定是進來一個家庭吃飯 一張桌子最多就擺 512 張椅子 但是如果一次來一萬個家庭 桌子不夠的話 排不進來的家庭就會在外面等別桌吃完再進來 : 2. CUDA 是 SIMT 單指令多執行緒 : 是一個thread 對應 一個指令如 + or * ? : 可是如果我要同時有乘和加 我要如何寫? : 直接寫+和* compiler 會幫我分配給thread? : ex. 矩陣相加是 : int i = threadIdx.x <----這裡是否要改成 const int i = threadIdx.x? 不用改 const : C[i] = A[i] + B[i] : 如果寫成 : for (int i = 0; i < N; i++) : C[i] = A[i] + B[i] : 是否等同上面的寫法? 每個thread做一個 +法 : 因為實在不知道 compiler 會幫我處裡的甚麼程度? : 因我看別人寫矩陣相乘有用到for-loop感覺很奇怪 : 是寫 : const int tid = threadIdx.x; : const int bid = blockIdx.x; : const int idx = bid * blockDim.x + tid; : const int row = idx / n; : const int column = idx % n; : float temp; : for(int i = 0; i < n; i++) : temp += a[row * N + i] * b[i * N + column]; : c[row * N + column] = temp; 可以寫乘法 可以用 for 也可以用 while 但是如果每個 thread 的 for 速度不一樣 (ex: n = threadIdx.x) 那同一桌大家會一起等吃最慢那個人吃完才能走 : 3. 如上面寫在globel的程式碼 float temp = 0; : temp 這個是佔顯示卡的記憶體還是main memory的? 這 float 在 glob"a"l 裡嗎? @@" 你可能漏看了一個叫做 register memory 的東西 : 4. 關於硬體上的SP和SM : 硬體和軟體定義上 : 一個SP同時處理一個thread : 一個SM負責最多8個block 同時處裡一個block : 而一個SM有8個SP 而執行的thread是以1 warp = 32 thread為單位 : 可是這就有對應上的問題 一個SM最多同時處裡8個thread 怎麼會以warp為單位呢? : 以及warp是為了隱藏從顯卡的記憶體抓資料所需的等待時間,可以轉換block執行 : 但這邊跟warp有甚麼關係呢? 這是跟block有關吧@@? : 對於warp這邊看不太懂...... 這個我也一直搞不太清楚 QQ : 5. 如果我用cudaMencpy() 是等複製完成 才會往下執行對吧 : 很怕抓資料不完成 : 可是我如果想利用這段等待時間 利用CPU運算其他東西 該如何弄呢? 可以用 cudaThreadSynchronize() : 6. 看到書上有時候用CUDA_SAFT_CALL(cudaMemcpy) 或改成 c....(cudaMalloc(..)) : 這種CUDA_SAFT_CALL有加和沒加差哪呢 感覺好像都一樣 這個我也不知道 QQ : 7. share memory時 : extern __shared__ float shared[]; : 和 __shared__ float shared[]; : 差別? : 書上是說有加extern 表將變數宣稱為外部陣列 這是啥意思? : 另share memory 可以動態宣告嗎?? 我看都是靜態的 不知道 again... : 8. 假設我要openCV和CUDA結合使用 : 是寫在.cu 還是 .cpp呢? : 假設我想要讀影像後傳到cuda運算 : 直接用cudaMencpy() 將 Image->data傳過去就好!? pointer 處理好 取值應該就沒問題 : 9. 如何分析我到底要幾個grid block thread? : 這邊不是很懂 : 目前是超過512就切block...... 我的方法是寫成可調變數一次跑一點點實驗出最佳值 最後再一次大量跑 : 謝謝大大們了 : 書上真的看不太懂....... 其實你直接在板上 "/" 搜尋 cuda 前 20 篇就有大大寫的超詳盡教學了 小弟也是讀完那整串教學就硬上 cuda 啦 加油加油~ -- 想你的時候 不一定能告訴你 如果不告訴你 也能會意 那我們就是有 真正的默契 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.192.107 ※ 編輯: bill42362 來自: 118.161.192.107 (07/25 21:32)