开发平台(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):