[问题] 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