推力变换性能数

时间:2014-03-03 06:12:10

标签: asynchronous cuda benchmarking synchronous thrust

任何人都可以告诉我推力例程是阻塞还是非阻塞? 我想要时间,这里是代码片段 -

代码段-1:

clock_t start,end;
start = clock();
thrust::transform( a.begin(), a.end(), b.begin(), thrust::negate<int>());
end  = clock();

代码段 - 2

clock_t start,end;
start = clock();
thrust::transform( a.begin(), a.end(), b.begin(), thrust::negate<int>());
cudaThreadSynchronize();
end  = clock();
代码段-2 相比,

代码段-1 花费的时间更少 为什么会这样?哪一个是计算推力程序的正确方法,以便我可以将它与我的并行代码进行比较。

1 个答案:

答案 0 :(得分:4)

我不相信Thrust正式定义哪些API在文档中的任何位置都是阻塞的,哪些是非阻塞的。但是,像您的示例一样的转换调用应该在单个后端闭包操作中执行(这将转换为没有主机设备数据副本的单个内核调用),并且应该是异步的。

您的第二个代码段更接近正确的Thrust操作计时方式,但请注意

  1. clock()通常使用低分辨率时间源实现,可能不适合对这些类型的操作进行计时。您应该找到更高分辨率的主机源计时器,或者更好的是,使用CUDA事件API来计算代码。您可以看到如何使用这些API的示例in this question-answer pair
  2. cudaThreadSynchronize是CUDA 4.0版本中不推荐使用的API。您应该使用cudaDeviceSynchronize代替。