簡體   English   中英

CUDA - 如何返回未知大小的結果

[英]CUDA - How to return results of unknown size

我正在將一個大型2D陣列(在C中)傳遞給設備並確定所有可能的組合。 例如:

A = 
id  val1 val2
1   100  200
2   400  800

Combination = 
id1  id2  sumval1  sumval2
1    2    500      1000

由於原始陣列的大小,存儲和返回所有可能的組合是不可能的。 我想返回sumval1> 500和sumval2> 1000的所有組合。

如何將這個組合子集返回給要寫入文件的主機; 鑒於我不知道有多少組合滿足條件?

一些可能的方法:

  1. 分配(從主機)你在GPU內存中留下的任何空間用於緩沖區。 如果超過這個數,那么無論如何都無法在一次傳輸中將所有組合傳回。 (這可能會導致您使用mtk99提出的解決方案)。
  2. 使用內核malloc在設備上根據需要動態分配空間。 在組合創建完成時,將所有單個組合收集到使用malloc創建的單個緩沖區中。 然后將此緩沖區的總大小和指向此緩沖區的指針傳遞回主機。 然后主機分配一個大小使用的一個新的緩沖區cudaMalloc ,並啟動一個內核將數據從創建的緩沖區拷貝malloc與創建緩沖區cudaMalloc 完成此復制內核后,主機可以從使用cudaMalloc創建的緩沖區將數據傳輸回主機。

我建議1可能是最好的方法而不知道你想要做什么。 在內核中, malloc在分配大量小分配時並不是特別快。 此外,在使用內核malloc ,請注意可以增加的默認大小限制(8MB)。

您可以分頁結果:

  • 創建一個修復結果數組(假設是Z項)。

  • 不僅返回結果,還返回您停止的點(last_id1,last_id2)。

  • 在下一個調用中,根據您的上一個結果傳遞一個新的起點(start_id1,start_id2)。

您可以使用流來保持GPU加載。

基於此,您甚至可以使用多個GPU分配計算。

暫無
暫無

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

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