2015-10-14 25 views
0

我需要動態分配GPU全局內存的大部分,比如說64 MB,這將花費很多時間;分配完成後,將從分配的空間開始複製。我想知道是否有可能以較小的塊(例如1 MB)分配64 MB並在每個分配的塊上啓動異步副本?請注意,我希望最終分配的空間是連續的。是否可以使用較小的塊對GPU全局內存進行大量連續分配?

另一個問題,沒有異步cudaMalloc或任何等價的存在,對嗎?

+1

'這需要很多時間'是什麼讓你這麼想?分配內存通常在頁面數量上是「O(n)」,因此一次分配64MB或64×1MB具有相同的算法複雜性。此外,分配通常需要某種形式的堆棧鎖定,如果您只做一次而不是64次,則這種堆棧更便宜。像往常一樣,YMMV,嘗試兩個和基準。 –

+0

謝謝Greogr,我的觀點是別的,我的意思是關於在GPU上運行的其他指令。但是,這是一個很好的觀點,「內存分配通常在頁面數量上是O(n)」。這是否也適用於cudaMalloc?你能否在這裏提供一個參考? – Iman

+1

我沒有訪問cudaMalloc的實現,所以我不能說它的複雜性(因此我的「典型」)。它可能是O(n),它可能是O(log n),它可能完全不同。 –

回答

2

我想知道是否有可能在較小的塊(例如1 MB)中分配64 MB並在每個分配的塊上啓動異步副本?請注意,我希望最終分配的空間是連續的。

不,這是不可能的。您無法控制分配將位於的地址空間中的哪個位置。無法請求位於特定地址的分配,或與另一個分配相鄰的分配。在這方面,行爲和能力與主機malloc非常相似,它們也沒有這些能力。

另一個問題,沒有異步cudaMalloc或任何等效的存在,對嗎?

cudaMalloc沒有「異步」版本。它通常會有阻塞行爲,因爲它正在修改GPU的地址映射。當GPU上沒有其他活動發生時(即沒有內核在執行,沒有正在進行的複製操作),地址映射的修改必須發生。

相關問題