簡體   English   中英

用CUB減少金額

[英]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::Reducetemp_storage指向cudaMalloc提供的先前分配),只要數據的大小和類型相同即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM