使用 Thrust、CUDA 进行慢速排序

Slow sorting using Thrust, CUDA

我是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

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

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

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

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