[問題] CUDA Memcpy相關問題

作者: v00623 (阿哩他命EX PLUS)   2017-07-12 17:25:08
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
GPGPU-Sim
問題(Question):
目前正在測試dependent kernel
kernel A 負責兩個陣列相加存到result array
kernel B 把kernel A的reult + 1
再將結果與CPU運算結果比對
一般的寫法是:
1.Memcpy兩個陣列的data到device
2.launch kernel A
3.將result複製回host
4.把result傳到device
5.launch kernel B
6.將運算結果複製回host
7.比對
但我把第三四步驟省略 比對結果也是正確的
請問是為什麼呢?
是因為kernel B需要的data與kernel A的result array記憶體位置相同?
或是有其他原因?
程式碼如下
https://gist.github.com/anonymous/5d8b6c58ce7ecd0407f6595d41fd8a2c
後來我改變他的data_size 例如200(原本是100)
結果前100個正確 後100個錯誤 這又是為什麼?
作者: Schottky (順風相送)   2017-07-12 17:41:00
第三和第四步驟 (36,37 兩行) 本來就是多餘的
作者: wheatdog (麥田圈裡的來福)   2017-07-12 17:44:00
3和4感覺沒有必要,可以直接把gpu的pointer傳給下個kernel
作者: Schottky (順風相送)   2017-07-12 17:45:00
錯誤的原因... 你問我我問誰...VectorAdd2 到底實際作用是什麼只有你知道但我覺得 17 行那個 idx 值可能跟你想的不一樣試試 int idx = blockIdx.x*blockDim.x + threadIdx.x;你的 block size 是不是高於 100 卻不到 200這麼說好了,你把 blockDim.x 存進 result array再 printf 出來看看和你想的一樣不一樣...這個問題嘛,只是你腦筋打結而已...device memory 又還沒有 free 掉,本來就不會平白消失跟前後 kernel 有沒有相依一點關係也沒有是說你害我很想買新顯示卡.....位址不就存在 dev_A, dev_B ... 裡面,位址值有變嗎?沒變的話為什麼不是存取同位址而且 device 和 host 之間的 memcpy 非常之慢資料可以直接留給下一個 kernel 何必再傳回來傳過去是的,從 allocate 到 free 之間那塊記憶體都固定給你用所以你負責記住那個位址(放在dev_C)並且用完要負責free跟平常寫 C 語言使用 host memory 的狀況是一樣的kernel 憑著 dev_C 的位址就可以存取到同一塊記憶體
作者: jun0325 (俊)   2017-07-16 14:04:00
加個cudaThreadSynchronize();確保GPU和CPU之間的data consistency。你變成data size變成200,有可能是GPU算太久,你又沒保證data consistency,所以CPU讀到不正確的資料

Links booklink

Contact Us: admin [ a t ] ucptt.com