[英]Sum reduction with CUB
根據本文 ,使用CUB庫減少總和應該是進行並行減少的最快方法之一。 如您在下面的代碼片段中所看到的,執行時間是不包括第一個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();
我認為這與內存准備有關,當我們減少相同數據幾倍時,不必每次都調用它
沒錯
但是,當我有許多具有相同數量的元素和數據類型的不同數組時,我每次都必須這樣做嗎?
不,您不需要每次都這樣做。 對cub::DeviceReduce::Reduce
的“首次”調用的唯一目的(即,當temp_storage=NULL
)是提供CUB所需的臨時存儲所需的字節數。 如果數據的類型和大小不變,則無需重新運行此步驟或后續的cudaMalloc
操作。 您可以簡單地在“新”數據上再次調用cub::DeviceReduce::Reduce
( temp_storage
指向cudaMalloc
提供的先前分配),只要數據的大小和類型相同即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.