如何确保cuda内核按顺序运行,并且在完成之前不执行任何cpu调用

时间:2016-03-06 13:21:56

标签: cuda

假设我们有以下cuda代码:

    kernel1<<<blockGrid, threadBlock>>>(gpu_out, gpu_in, THREADS);
    cerr << "a: " << cudaGetErrorString(cudaGetLastError()) << endl;

    cudaDeviceSynchronize();

    kernel2<<<blockGrid, threadBlock>>>(gpu_out2, gpu_out, gpu_in);
    cerr << "b: " << cudaGetErrorString(cudaGetLastError()) << endl;

    cudaDeviceSynchronize();

    cout << "c " << endl;

我需要在继续下一个内核之前处理gpu_out,并且两个内核都应该在执行剩余的cpu代码之前完成它们的工作。

即使我包含cudaDeviceSynchronize()次调用,代码也不按顺序运行,因为输出如下所示:

 a: no error
 c
 b: no error

2 个答案:

答案 0 :(得分:2)

你错误地解释了输出。您编写的代码将按顺序执行。

更改所有流I / O以使用相同的流cerrcout,而不是两者。

答案 1 :(得分:2)

cerr和cout是缓冲流。他们不以任何特定顺序刷新您的控制台与写入它们的调用的执行顺序无关。尝试将输出切换到cout到输出到cerr,而不是正确地查看它们。