PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_and_CPP
[问题] CUDA CPU和GPU执行同步问题
楼主:
LOXAERIC
2014-05-23 18:44:58
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux , 显卡 cuda compute capability: 1.3, CUDA 2.3版
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
CUDA
问题(Question):
最近因为要处理矩阵运算,所以开始研究CUDA,有看过一些精华区的教学文章了,
不过有些地方还不是很清楚,因此想请问版友下面的一些情况,
CPU和GPU的执行顺序以及效能影响各会是如何?
Case 1. :
kernel_A<<<GridSize,BlockSize>>>(d_result1,d_arg1);
...CPU function1...
cudaThreadSynchronize();
kernel_B<<<GridSize,BlockSize>>>(d_result2,d_data1);
kernel_C<<<GridSize,BlockSize>>>(d_result2,d_data1);
...CPU function2...
Case 2. :
kernel_A<<<GridSize,BlockSize>>>(d_result1,d_arg1);
//复制kernel_A的结果(d_resut1)回CPU(result1)
cudaMemcpy(result1, d_result1, size, cudaMemcpyDeviceToHost);
...CPU function1(result1)...
预期的正确结果(Expected Output):
这是我自己的想法,不晓得正不正确
Case 1. : CPU呼叫kernel_A后,自己不等GPU执行完kernel_A,
CPU直接继续执行function1,直到cudaThreadSynchronize(),
确保kernel_A被执行完,接下来CPU连续呼叫kernel B和C,
一样不等GPU是否执行完这两个kernel,继续直接执行function2,
而kernel B和C因为会使用相同的d_data1,可能因为同时执行而
互抢著向memory access data1,造成效能下降,且因为都会写
data到d_result2,所以会有race condition。
Case 2. : CPU呼叫kernel_A后,自己不等GPU执行完kernel_A,
CPU直接继续执行cudaMemcpy,但是因为cudaMemcpy的是kernel_A的结果,
所以CPU会等到kernel_A被执行完才复制结果回CPU端,
接下来CPU就执行function1。
综合以上,我目前的想法是,CPU呼叫完kernel后,不会等kernel是否执行完,
除非 1.使用cudaThreadSynchronize() 2.使用cudaEventSynchronize
3.使用cudaMemcpy,且复制的资料需要是前面kernel所用的参数
这几种情形才会强制让CPU和GPU端同步,不晓得这样理解是否正确@@?
补充说明(Supplement):
作者:
k387259
(台湾李宏感)
2014-05-24 07:44:00
GPU跟CPU的同步现在都是使用cudaDeviceSynchronizeThreadSynchronize似乎是比较旧的版本
http://ppt.cc/5M1V
然后kernelB和C会顺序执行 除非你是用stream 但CPU依然跑下一个functionstream部分可以参考官方PDF
http://ppt.cc/i2oe
然后你说的除非3 cudaMemcpy我的理解应该是 你不是用Async的话,应该都是算是cpu的指令最近我也在用CUDA写程式,不足的地方还请版友补充
作者:
Lepton
(轻子)
2014-05-24 12:36:00
<<<a,b>>>的呼叫法都是异步的,不等做完就往下走GPU有自己的queue就是stream的意思,不写都是默认的每个queue都会保证依序执行,所以kerenlBC是顺序的做memcpy会保证queue执行完后才作复制的动作且CPU也会stall学CUDA建议直接看官方的说明书,CUDA的东西变化很快
楼主:
LOXAERIC
2014-05-24 13:25:00
了解,非常感谢Lepton版友解释!!
作者:
k387259
(台湾李宏感)
2014-05-24 15:42:00
你可以写只测试程式cuda kernel内可以printfkernel让他跑个<<1,1>>然后里面一个大循环在printf
楼主:
LOXAERIC
2014-05-24 15:52:00
喔喔,看了一下我的平台好像只能用cuPrintf,不过我会试看看,感谢!
继续阅读
[问题] 关于指标的问题
LeeGarDer
[问题] 阵列名称与指标
kumusou
[问题] 阵列无法宣告太大?(最短路径算法)
hfuman
[问题] 面试遇到的问题
kumusou
[问题] 如何让C语言依据时间去执行某件事情..
BIAO
[问题] loop循环数不固定
parkko
[分享] unreal engine 4 跨平台建置
damody
Re: [问题] 请问如何用程式把IP Camera画面抓下来
Jockey66666
[问题] 程式使用内存的上限
googled
[问题] 影像去模糊
tsmctsmc
Links
booklink
Contact Us: admin [ a t ] ucptt.com