看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《ofd168 (大色狼來襲)》之銘言: : ※ 引述《bill42362 (酒池肉林夜夜生科)》之銘言: : : 想像一個 thread 是一個人 : : 一個 block 就是一個家庭 許多人組成一個家庭 : : 你開一間餐廳(grid) 一次一定是進來一個家庭吃飯 : : 一張桌子最多就擺 512 張椅子 但是如果一次來一萬個家庭 : : 桌子不夠的話 排不進來的家庭就會在外面等別桌吃完再進來 : 看不太懂 那為何要很多家餐廳(grid)? 餐廳一直只有一個阿 gridDim 是指定一個 grid 有幾個 block blockDim 是指定一個 block 有幾個 thread : : 不用改 const : : 可以寫乘法 可以用 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? 不確定真的用了 const 是什麼效果 我是從來都沒用過拉 @@" : 感覺有點怪怪的 : 那一種比較好? : : 這 float 在 glob"a"l 裡嗎? @@" : : 你可能漏看了一個叫做 register memory 的東西 : OK 我回去研究 : : 這個我也一直搞不太清楚 QQ : : 可以用 cudaThreadSynchronize() : 書上是說 : cudaThreadSynchronize() 是用來 實現GPU和CPU的同步,利用此函式可以確認 : 所有的裝置端執行緒已運行結束 : 這是啥意思? 這不是意思是 會等CUDA的kernel執行完? 嗯 我想我有點說錯了 在 cpu 端的函數應該都是一步一步執行的 如 cudaMemcopy() cudaThreadSynchronize() 和還有其他一般算式 需要同步的應該只有 "kernal" (有用到 <<<>>> 那些) 和 cpu 端的步驟 所以我自己是都只在一串 kernal 之前才用 cudaThreadSynchronize() : 以及cudaStreamSynchronize()和cudaEventSynchronize() : 這3個函數的作用和之間的差別是啥呢 : 這三個都有看過有人用 除了知道是同步用 但會拖累效能以外 真的不是很懂 : : 這個我也不知道 QQ : 這書上忽然拿出來用 後面又不用 搞不是很懂Orz : : 不知道 again... : : pointer 處理好 取值應該就沒問題 : 恩恩 謝謝, 我有看過有人有.cu 和 .cpp在同一個project : 作用為何呢? 就是同一個 project 阿 最後編成一個執行檔這樣...@@" : : 我的方法是寫成可調變數一次跑一點點實驗出最佳值 : : 最後再一次大量跑 : 所以只能try and error? 是也不會 error 阿 速度有差而已 真要仔細點推算就要看用到幾個 register variable 然後看你的硬體結構去估 (一個 block 有固定的 register 總量 不夠就會用到 global) 不過怎麼推都不會有實際跑來的準阿 : : 其實你直接在板上 "/" 搜尋 cuda : : 前 20 篇就有大大寫的超詳盡教學了 : : 小弟也是讀完那整串教學就硬上 cuda 啦 加油加油~ : 恩恩 b大大真的很厲害 : 這樣就能上路 也感謝大大的解疑 若有錯誤請不吝指正 QQ -- 想你的時候 不一定能告訴你 如果不告訴你 也能會意 那我們就是有 真正的默契 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.48.199