用CUB减少总和

时间:2015-09-03 16:29:18

标签: cuda cub

根据this article,使用CUB库减少总和应该是实现并行减少的最快方法之一。正如您在下面的code片段中看到的那样,执行时间是先测量cub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, in, out, N, cub::Sum());,我认为它与内存准备有关,当我们减少相同数据的几倍时,它就是&每次都需要调用它,但是当我有许多不同的数组具有相同数量的元素和数据类型时,我每次都必须这样做吗?如果答案是肯定的,那就意味着使用CUB库变得毫无意义。

  size_t temp_storage_bytes;
  int* temp_storage=NULL;
  cub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, in, out, N, cub::Sum());
  cudaMalloc(&temp_storage,temp_storage_bytes);

  cudaDeviceSynchronize();
  cudaCheckError();
  cudaEventRecord(start);

  for(int i=0;i<REPEAT;i++) {
    cub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, in, out, N, cub::Sum());
  }
  cudaEventRecord(stop);
  cudaDeviceSynchronize();

1 个答案:

答案 0 :(得分:1)

  

我认为它与内存准备有关,当我们将相同数据减少几次时,每次调用它都是不必要的

这是正确的。

  

但是当我有许多不同的数组具有相同数量的元素和数据类型时,我每次都必须这样做吗?

不,你不需要每次都这样做。 cub::DeviceReduce::Reduce的“第一次”调用(即temp_storage=NULL时)的唯一目的是提供CUB所需的临时存储所需的字节数。如果数据的类型和大小没有变化,则无需重新运行此步骤或后续cudaMalloc操作。只要数据的大小和类型相同,您就可以再次呼叫cub::DeviceReduce::Reducetemp_storage指向cudaMalloc提供的“新”数据的先前分配)。