2013-04-18 66 views
3

使用推力device_malloc而不是正常的cudaMallocdevice_new做什麼有什麼優勢?推力裝置_malloc和device_new

對於device_malloc它似乎使用它的唯一原因是它只是一點點清潔。

device_new文件說:

「device_new實現了設備內存類型居民 安置新的運營商device_new呼籲 物體在設備存儲器中的陣列上T的空構造無記憶被分配。這個功能「。

我不明白...

回答

1

device_malloc的回報,如果你打算使用推力其他東西對象的正確類型。如果您正在使用Thrust,通常沒有理由使用cudaMalloc。封裝CUDA調用使它更簡單,通常更清潔。 C++和STL容器與C風格的數組以及malloc也是一樣的。

對於device_new,你應該閱讀documentation下列行:

template<typename T> 
device_ptr<T> thrust::device_new (device_ptr<void> p, const size_t n = 1) 

號碼:甲device_ptr設備內存在其中的一個區域來構造 一個或多個TS。

基本上,如果內存已分配,可以使用此功能。只有默認的構造函數會被調用,並且這將返回鑄造成T型的device_pointer

在另一方面,下面的方法分配內存,並返回一個device_ptr<T>

template<typename T > 
device_ptr<T> thrust::device_new (const size_t n = 1) 
+0

乾杯,我不知道爲什麼沒有一個人指出,我可以使用推力device_new時[我發佈了一個問題有關複製對象到設備內存](http://stackoverflow.com/questions/16024087/copy-an-object-to-device)! 據我所知,我仍然需要手動複製這些字段,但第一步(複製對象本身)最好用推力來完成。 –

+0

那麼,每個人都不會使用Thrust。對於簡單的事情,您並不需要它,但它使您的代碼對非CUDA開發人員更清晰易讀。知道如何在沒有Thrust的情況下做事情是一件好事,否則,一旦開始調試代碼,您可能會迷失方向。 – BenC

1

所以我想我找到了爲device_new

一個很好地利用它基本上是初始化對象並將其複製到設備更好的方法,同時在主機上持有指向它的指針。

所以不是這樣做的:

​​

我可以這樣做:

thrust::device_ptr<Particle> p = thrust::device_new<Particle>(1); 
test2<<<1,1>>>(thrust::raw_pointer_cast(p));