※ 引述《bill42362 (酒池肉林夜夜生科)》之銘言:
: ※ 引述《ofd168 (大色狼來襲)》之銘言:
: 想像一個 thread 是一個人
: 一個 block 就是一個家庭 許多人組成一個家庭
: 你開一間餐廳(grid) 一次一定是進來一個家庭吃飯
: 一張桌子最多就擺 512 張椅子 但是如果一次來一萬個家庭
: 桌子不夠的話 排不進來的家庭就會在外面等別桌吃完再進來
看不太懂 那為何要很多家餐廳(grid)?
: : 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]
: 可以寫乘法 可以用 for 也可以用 while
: 但是如果每個 thread 的 for 速度不一樣 (ex: n = threadIdx.x)
: 那同一桌大家會一起等吃最慢那個人吃完才能走
所以上面2個程式效果會一樣?
只是用for寫 如果有一個thread執行C[i] = A[i] + B[i]比較慢
全部thread都要等最慢那個 而
int i = threadIdx.x
C[i] = A[i] + B[i]
這種的不用?
要等的意思是不做事空轉?
另 int i = threadIdx.x <--- i不是register?
const int i = threadIdx.x <--- i是constant memory?
感覺有點怪怪的
那一種比較好?
: : 3. 如上面寫在globel的程式碼 float temp = 0;
: : temp 這個是佔顯示卡的記憶體還是main memory的?
: 這 float 在 glob"a"l 裡嗎? @@"
: 你可能漏看了一個叫做 register memory 的東西
OK 我回去研究
: : 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()
書上是說
cudaThreadSynchronize() 是用來 實現GPU和CPU的同步,利用此函式可以確認
所有的裝置端執行緒已運行結束
這是啥意思? 這不是意思是 會等CUDA的kernel執行完?
以及cudaStreamSynchronize()和cudaEventSynchronize()
這3個函數的作用和之間的差別是啥呢
這三個都有看過有人用 除了知道是同步用 但會拖累效能以外 真的不是很懂
: : 6. 看到書上有時候用CUDA_SAFT_CALL(cudaMemcpy) 或改成 c....(cudaMalloc(..))
: : 這種CUDA_SAFT_CALL有加和沒加差哪呢 感覺好像都一樣
: 這個我也不知道 QQ
這書上忽然拿出來用 後面又不用 搞不是很懂Orz
: : 7. share memory時
: : extern __shared__ float shared[];
: : 和 __shared__ float shared[];
: : 差別?
: : 書上是說有加extern 表將變數宣稱為外部陣列 這是啥意思?
: : 另share memory 可以動態宣告嗎?? 我看都是靜態的
: 不知道 again...
: : 8. 假設我要openCV和CUDA結合使用
: : 是寫在.cu 還是 .cpp呢?
: : 假設我想要讀影像後傳到cuda運算
: : 直接用cudaMencpy() 將 Image->data傳過去就好!?
: pointer 處理好 取值應該就沒問題
恩恩 謝謝, 我有看過有人有.cu 和 .cpp在同一個project
作用為何呢?
: : 9. 如何分析我到底要幾個grid block thread?
: : 這邊不是很懂
: : 目前是超過512就切block......
: 我的方法是寫成可調變數一次跑一點點實驗出最佳值
: 最後再一次大量跑
所以只能try and error?
: : 謝謝大大們了
: : 書上真的看不太懂.......
: 其實你直接在板上 "/" 搜尋 cuda
: 前 20 篇就有大大寫的超詳盡教學了
: 小弟也是讀完那整串教學就硬上 cuda 啦 加油加油~
恩恩 b大大真的很厲害
這樣就能上路 也感謝大大的解疑
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.18.104.235
※ 編輯: ofd168 來自: 163.18.104.235 (07/26 12:13)