2012-07-23 44 views
0
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); 
    } 
} 

上面的代码是关于计算内核的。如何在CUDA中同步我自己的内核函数?

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

“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

您的诊断错误。这些内核不会同时运行,因为它们都被启动到同一个流中。问题的根源是别的,可能是内核错误,或者其中一个根本没有运行。您应该添加错误检查到您的主机代码,以查看可能出错 – talonmies 2012-07-23 05:46:40

+0

谢谢,talonmies。我会检查我的内核 – 2012-07-23 05:49:24

回答

1

您可以在内核执行之间使用cudaDeviceSynchronize以确保顺序排列。然而,你的代码并不需要这个,所以我认为你的内核可能存在一个bug。

+0

谢谢,perreal。我会检查我的内核代码 – 2012-07-23 05:48:27