如何在CUDA中同步我自己的内核函数?

时间:2012-07-23 05:38:38

标签: cuda

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);
    }
}

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

内核函数的功能就是这样。

  

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

     

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

     

“findMax”:在d_arr_part中找到最大值,最大值存储到d_max。

     

“positionChange”:d_arr元素根据d_max值更新。

问题

当我执行我的程序时,结果没有一致性。每当我执行时,结果都会改变。我在谷歌搜索这个问题,发现内核函数是同时执行的。我的内涵是所有内核函数按顺序执行。我在3.2.5节阅读了NVIDIA的CUDA C编程指南。但我无法理解如何解决问题。如果有人有想法,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:1)

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