2013-08-27 34 views
-1

通過執行掃描操作來壓縮數組(將輸入數組中的所需元素放入輸出數組)後,輸出(壓縮)數組中可能會留下一些空白空間在需要的元素被放置之後以連續的形式。有沒有辦法在OpenCL內核代碼本身釋放這些空白空間,而不必返回主機(僅僅是爲了刪除)......?在OpenCL內核代碼中刪除數組中的某些元素

例如,我有一個100個元素的輸入數組,其中一些no.s大於50,其中一些小於50,並且希望將no.s超過50個存儲在不同的數組中,並且僅進一步處理這些數組中的元素,我不知道這個輸出數組的大小,因爲我不知道有多少no.s實際上大於50(所以我聲明這個數組的大小爲100)...然後執行掃描後,我得到輸出數組的所有元素超過50 ...但在這些元素的存儲後,輸出數組中可能會有一些空的連續空間......那麼我們如何刪除這些空間......有沒有在內核代碼中做到這一點的方法...?或者我們是否必須回到主機代碼中...?

如果我們不能刪除內核代碼本身的剩餘空間,並且如果我們不想回到主代碼中,我們如何處理這樣的壓縮數組以進行進一步處理。

+1

您不能更改內核中數組的長度或動態數據結構的大小。如果您打算調整數組大小以節省一些空間,則需要調整主機中的數組大小。我不確定「僅僅是爲了刪除」會是一個足夠的理由去做你想做的事情。順便說一句,你想做什麼?隱式刪除這些空格的一種典型方法是對數組進行排序,以便所有空格都位於開頭(或結尾),找出有效元素的數量及其起點,並在內核中使用它來僅處理數組的一部分。 – Thomas

回答

0

恐怕沒有簡單的解決方案來解決您的問題。

我認爲你可能要做的是在每個數組中都有一個計數器。您可以先使用atomic_inc()在本地增加計數器,然後使用atomic_add()在全局增加計數器。 這樣,在內核執行結束時,每個數組中的元素總數將會出現。

您也可以使用此原子操作作爲數組的索引。通過這種方式,您可以在陣列中沒有任何「洞」的情況下寫入輸出。但是,恐怕由於濫用原子操作,你可能會失去一些速度。

+0

我在數組之間沒有任何空洞......空白空間本身就在最後,因爲我已經對上面提到的輸入數組執行了掃描操作。我只是想知道一種刪除重複元素放置後放置的元素的方法...! 我想這樣做是因爲如果在最後有一些空的空格,這會損害GPU的性能,因爲一些線程保持空閒狀態,並且使用一些不必要的GPU內存佔用......! – Nitin

+0

通過另一種方式,我的意思是說有什麼方法可以設置實際上有多少個線程將在數組上執行限制?例如,我有100個元素的數組,但我只能使用50個線程對它們進行操作......?有沒有限制全球規模的結局......? – Nitin

+0

如果您已經知道元素的數量,並且元素位於數組的開頭。那麼解決方案是微不足道的。有一個很大的陣列,只使用開始並不會損害你的速度。只需將全球規模縮小至新的規模即可。 – DarkZeros