我一直在与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);}
答案 0 :(得分:2)
无论是从main
还是从另一个函数调用,内核启动都是异步的。在内核开始执行之前,控制立即返回到主机线程,主机线程将继续执行内核启动后的任何主机代码。
你的两个案件应该完全一样。
您不能使用函数调用启动来“规避”使用同步函数(流或其他)。如果你只想在内核完成之后打印“gpu call”,你需要在print语句之前使用某种同步函数。
看起来这应该是很容易测试的东西。