CPU 和GPU 交互出错的问题

最近编成遇到很奇怪的问题。

我在C 程序的主循环中调用C 函数,这些 C 函数 是为了调用CUDA内核函数 而生成的,也就是调用用cuda 内核的。
包括下面的BSplineInterpolation , warp_2D,
Evaluate_BBCU_2D, Add_BBCC_2D。 其目的就是在GPU用计算

最后一个向硬盘存数据的函数WriteRawData 是C 函数, 不是计算体需要的。

我的问题是:
开始,并没有最后一个存数据的过程。
计算总出错。
说是gpu 内存问题。
如实我想输出中间结果,就是每步(每个iter)看看。
1。开始时,是键盘手动输入要存储的文件名。发现循环竟然不出错,检查输出结果,结果也没什么问题。

2。这样,觉得很奇怪,为加快速度和循环连续性,改成自动输出数据, 也就是不从键盘输入文件名。

这样,同样的错误又来了。 真的很奇怪,无法理解。
如是想重复存储多次来延长一下时间,程序又能工作。

我听说CPU在执行命令时,把GPU的工作传到显卡上后,就接着做下面的命令,不等上面的GPU命令完成,这样如果下面一段CPU程序,要用到正在GPU中更新的数据的话,整个程序就出问题了。

大侠说说,是这么会事吗?

我的这段程序会与这个有关吗?

如果真是这样怎么设定程序, 让CPU等上面的GPU运算结束 再计算后面的?

非常感谢!

for(iter = 0L; iter < iterCG; iter++){

BSplineInterpolation_2D(MvectX, MX, ImageSize, volumeSize, masking);
BSplineInterpolation_2D(MvectY, MY, ImageSize, volumeSize, masking);			    
...
warp_2D(WarpVoxel, RefVoxel, MvectX, MvectY, ImageSize);


Evaluate_BBCU_2D(BB, DiffVoxel, DerRefX, DerRefY, Mvect0, volumeSize, ImageSize, indexBspline);
Add_BBCC_2D(BB, XX, CC, volumeSize, alpha);

for(i=1;i<1000;i++){
WriteRawData(XX, ByteMatrix, 1, 1);
}
//WriteByteImageRawData(XX, ByteMatrix, 1, 1);
}

}//end of first part