根据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();
答案 0 :(得分:1)
我认为它与内存准备有关,当我们将相同数据减少几次时,每次调用它都是不必要的
这是正确的。
但是当我有许多不同的数组具有相同数量的元素和数据类型时,我每次都必须这样做吗?
不,你不需要每次都这样做。 cub::DeviceReduce::Reduce
的“第一次”调用(即temp_storage=NULL
时)的唯一目的是提供CUB所需的临时存储所需的字节数。如果数据的类型和大小没有变化,则无需重新运行此步骤或后续cudaMalloc
操作。只要数据的大小和类型相同,您就可以再次呼叫cub::DeviceReduce::Reduce
(temp_storage
指向cudaMalloc
提供的“新”数据的先前分配)。