※ 引述《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