如何在CUDA中同步自己的内核函数? extern“C”void callKernel() { 对于(int i=0;i(d_arr); copyElement>(d_arr,d_arr_part,3); findMax>(d_arr_部分,d_max); 位置变化>(d_arr,d_max); } }

如何在CUDA中同步自己的内核函数? extern“C”void callKernel() { 对于(int i=0;i(d_arr); copyElement>(d_arr,d_arr_part,3); findMax>(d_arr_部分,d_max); 位置变化>(d_arr,d_max); } },cuda,Cuda,上面的代码是关于计算内核的 内核函数的功能是这样的 “计算”:在d_arr中计算并更新d_arr的元素值 “copyElement”:例如,d_arr是4步数组,在数组中,我只需要第三个元素,所以我分配其他变量d_arr_part,并将d_arr的第三个元素复制到d_arr_part “findMax”:在d_arr_零件中查找最大值,最大值存储到d_max “位置更改”:根据d_最大值更新d_arr元素 问题 当我执行我的程序时,结果不一致。每当我执行时,结果都会改变。我在谷歌搜索这个问题,发

上面的代码是关于计算内核的

内核函数的功能是这样的

“计算”:在d_arr中计算并更新d_arr的元素值

“copyElement”:例如,d_arr是4步数组,在数组中,我只需要第三个元素,所以我分配其他变量d_arr_part,并将d_arr的第三个元素复制到d_arr_part

“findMax”:在d_arr_零件中查找最大值,最大值存储到d_max

“位置更改”:根据d_最大值更新d_arr元素

问题
当我执行我的程序时,结果不一致。每当我执行时,结果都会改变。我在谷歌搜索这个问题,发现内核函数是并发执行的。我的意图是所有内核函数都是按顺序执行的。我阅读了NVIDIA的CUDA C编程指南第3.2.5节。但我不明白该怎么做解决问题。如果有人有想法,请告诉我怎么做。提前谢谢。

您可以在内核执行之间使用
cudaDeviceSynchronize
,以保证顺序。但是,您的代码不需要这样做,所以我想您的内核可能有错误。

您的诊断不正确。这些内核无法运行同时,因为它们都被发送到同一个流中。问题的根源是其他原因,可能是内核中的一个错误,或者其中一个根本没有运行。您应该在主机代码中添加错误检查,以查看可能出现的错误。谢谢,talonmies。我会检查我的内核
extern "C" void callKernel()
{
    for(int i=0;i<10;i++)
    {
        calc<<< grid, thread >>>(d_arr);
        copyElement<<< grid, thread >>>(d_arr,d_arr_part,3);
        findMax<<< grid, thread >>>(d_arr_part, d_max);
        positionChange<<< grid, thread >>>(d_arr, d_max);
    }
}