2017-03-16 121 views
1

我是CUDA的新手,正在嘗試編寫自己的內核。CUDA數組/矢量刪除

在CPU方面,我有一系列包含整數(一個向量/ GPU線程)的向量。

我希望每個GPU線程從其向量中移除一些元素,然後我將其複製回主機。在CPU方面可比的操作是:

vector.erase(element_number); 

我的理解是,STL型矢量不支持GPU,我真的不能使用推力(因爲我用我自己的內核)。但是,我可以將CPU向量轉換爲數組(包括元素數量的數據),然後將這些數組複製到GPU。然後,如果我確定了一個要刪除的元素,我可以將下面的所有元素向上移動並減少元素的總數。

在我重新創建輪子並寫入之前,我的問題是:是否有一些CUDA支持的操作已經這樣做?

+1

CUDA沒有內置任何內容提供像這樣的矢量操作或數組操作。雖然這樣的操作對程序員來說似乎很方便,但它們並不是特別高的性能,所以你可能想要提出一種不需要這種插入/刪除操作的不同的數據管理方案。 –

回答

1

不是。您必須按照您描述的方式編寫自己的矢量類。

如果您不關心矢量中元素的順序,可以通過交換要刪除的元素和矢量中的最後一個元素來實現刪除操作,然後遞減大小而不是移動一切。

+0

感謝您的回覆。我知道這不能充分利用GPU。底層算法強制您按順序執行此部分。儘管如此,因爲數百/數千個線程將同時運行,所以這應該仍然比CPU版本快得多。這裏的向量對應於OpenCV輪廓點因此,您需要保持向量順序以保持輪廓完整性。 – user1805103

+0

還有很多方法可以避免像這樣一個接一個地移動矢量元素的痛苦過程。一個簡單的間接方案可以工作。如果它偶爾有意義,你可以使用收集方法恢復向量順序。根據您的實際使用情況,這些可能比僅僅使用向量插入/刪除更有效。 –

+0

你有沒有一種特定的間接方案?由於元素只是整數,所以非常簡單的元素可能無法工作,因爲節省的複製時間只是轉移到元素訪問花費的時間(因爲您必須計算位置)。爲了說明一下,這些矢量可能有2000個元素,但是最終會減少到20個。我正在使用的愚蠢計劃開始緩慢,但隨着元素被移除而加速。 – user1805103