使用 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 包含在测量中当然是合理的。)
我是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 包含在测量中当然是合理的。)