【问题标题】:Slow sorting using Thrust, CUDA使用 Thrust、CUDA 进行慢速排序
【发布时间】:2016-11-07 01:01:21
【问题描述】:

我是 CUDA 的新手。我只是尝试使用 Thrust 对数组进行排序。

clock_t start_time = clock(); 

thrust::host_vector<int> h_vec(10);
thrust::generate(h_vec.begin(), h_vec.end(), rand);
thrust::device_vector<int> d_vec = h_vec;

thrust::sort(d_vec.begin(), d_vec.end());
//thrust::sort(h_vec.begin(), h_vec.end());

clock_t stop_time = clock(); 
printf("%f\n", (double)(stop_time - start_time) / CLOCKS_PER_SEC);

排序d_vec 花费的时间是7.4s,排序h_vec 花费的时间是0.4s

我假设它在设备内存上并行计算,所以它不应该更快吗?

【问题讨论】:

  • 您很可能正在测量context creation time。此外,您不能期望 small 向量在高度并行的架构上排序更快。尝试使用矢量大小 >> 10000。
  • 是的,你是对的,这些时间是在第一次执行时。此外,我尝试了 50k 点,我在主机和设备上的时间都是 0.12 秒。当大小接近 100000 时差异变大。我可以假设使用 h_vec 进行排序在 CPU 上吗?
  • 是的,h_vec 上的排序是在主机上完成的。也许您应该阅读thrust quick start guide,其中讨论了推力算法的调度。
  • @havogt 如果您想提供答案,我会投票赞成。

标签: sorting cuda thrust


【解决方案1】:

可能主要问题是上下文创建时间:第一次 CUDA 调用将初始化 CUDA 上下文,这需要一些时间,请参阅here。因此,您应该在第一次 CUDA 调用之后才开始测量时间。

通常,如果并行度足够高,您只能期望 GPU 代码比 CPU 代码更快。示例代码中的向量大小为 10 肯定太小而无法实现加速。如果矢量大小 >> 10000,您可以期望充分利用现代 GPU。

您还应该考虑仅测量排序时间而不使用副本d_vec = h_vec,因为通常您将在下一步中使用设备向量。然后,您可以将复制操作视为一次性设置成本。 (但是,如果排序是设备上唯一的操作,那么在测量中包含内存副本当然是合理的。)

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 2015-03-24
    • 2012-02-21
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多