CUDA主机 - 设备同步

时间:2018-01-05 23:13:08

标签: c++ concurrency cuda

我一直在与CUDA合作,并对同步有疑问。考虑我有以下代码。 我在main中以两种不同的样式调用相同的内核。 据我所知,第一次,内核将被触发并立即控制回到主机并打印“gpu call”。 那么从函数中触发内核呢? 在内核调用之后,控件是否会立即返回到主机,还是等待内核完成然后返回主机?

换句话说,如果我只想在内核执行后打印“gpu call”,那么从函数调用内核是否会绕过这个特殊情况下的stream和cudastreamsynchronize()的使用?

int initializedevvar(bool *s1, bool *s2, bool *s3, bool *s4){
initialize<<<1,1>>>(state1, state2, state3, state4);
return 0;
}
    __global__ void initialize(bool* Mcheckin, bool *Mcheckout, bool 
 *Scheckin, bool *Scheckout){
            Mcheckin[0] = true;
            Mcheckout[0] = true;
            Scheckin[0] = false;
            Scheckout[0] = false;
        }
void main(){
    bool *state1, *state2, *state3, *state4;

               cudaMalloc(&state1, sizeof(bool));
    cudaMalloc(&state2, sizeof(bool));
    cudaMalloc(&state3, sizeof(bool));
    cudaMalloc(&state4, sizeof(bool));
    initialize<<<1,1>>>(state1, state2, state3, state4);
    std::cout<<"gpu call"<<endl;
    ...
    ...
    auto dummy = initializedevvar(state1, state2, state3, state4);
    std::cout<<"gpu call"<<endl;
    cudaFree(state1);
    cudaFree(state2);
    cudaFree(state3);
    cudaFree(state4);}

1 个答案:

答案 0 :(得分:2)

无论是从main还是从另一个函数调用,内核启动都是异步的。在内核开始执行之前,控制立即返回到主机线程,主机线程将继续执行内核启动后的任何主机代码。

你的两个案件应该完全一样。

您不能使用函数调用启动来“规避”使用同步函数(流或其他)。如果你只想在内核完成之后打印“gpu call”,你需要在print语句之前使用某种同步函数。

看起来这应该是很容易测试的东西。