2017-09-22 36 views
-1

我有一個相當簡單的cuda問題,看起來應該是一個簡單的操作:根據第二個布爾值數組從第一個數組中刪除元素。我採取的步驟是:Cuda/Thrust:remove_if不會更改device_vector.size()?

  1. 創建與處理的輸入數組大小相同的bools的device_vector。
  2. 調用將從(1)中設置一些元素爲真的內核
  3. 使用來自(2)的已處理數組的謂詞調用輸入數組上的remove_if。
  4. 對於設置爲true的bool數組中的每個值,從輸入數組中刪除相應的元素。

我所看到的是輸入數組沒有改變,我不知道爲什麼?

struct EntryWasDeleted 
{ 
    __device__ __host__ 
    bool operator()(const bool ifDeleted) 
    { return true; } 
}; 

    //This array has about 200-300 elements 
    //thrust::device_vector<SomeStruct> & arrayToDelete 

    thrust::device_vector<bool>* deletedEntries = 
     new thrust::device_vector<bool>(arrayToDelete.size(), false); 

    cuDeleteTestEntries<<<grid, block>>>(thrust::raw_pointer_cast(arrayToDelete.data()), countToDelete, heapAccess, thrust::raw_pointer_cast(deletedEntries->data())); 

    cudaDeviceSynchronize(); 
    thrust::remove_if(arrayToDelete.begin(), arrayToDelete.end(), deletedEntries->begin(), EntryWasDeleted());  

    //I am expecting testEntries to have 0 elements 
    thrust::host_vector<SomeStruct> testEntries = arrayToDelete; 
    for(int i = 0; i<testEntries.size(); i++) 
    { printf("%d", testEntries[i].someValue); } 

在這個示例中,我總是返回true以用於測試的謂詞。但是,當我這樣做:testEntries = deletedEntries並輸出成員。我可以驗證deletedEntries是否正確填入了trues和falses。

我的期望是testEntries將有0個元素。但它不,我得到一個輸出,就好像remove_if沒有做任何事情。即:輸出顯示輸入數組中的所有元素。我不知道爲什麼?有沒有從device_vector中刪除元素的特定方法?

+1

你有沒有費力去閱讀remove_if的文檔? https://thrust.github.io/doc/group__stream__compaction.html#ga307d7f64566909172a3f9e16b7e2ad53 – talonmies

+1

標題中提出的問題與問題中提出的問題不同(改變矢量的大小有所不同,因爲標題指示,並改變向量中包含的值,這兩個想法是不一樣的)。關於標題中提出的問題,毫無例外地,沒有推力**算法**(比如'remove_if'),它可以在任何地方*修改任何矢量大小。 –

回答

1

所以你需要捕獲正從的remove_if

thrust::device_vector<SomeStruct>::iterator endIterator = 
    thrust::remove_if(arrayToDelete.begin(), arrayToDelete.end(), 
deletedEntries->begin(), EntryWasDeleted());  

然後返回,當你將數據複製回主機,而不是使用推力主機和設備之間的默認賦值運算符做到這一點的迭代器:

thrust::host_vector<SomeStruct> testEntries(arrayToDelete.begin(),endIterator); 

作爲旁註,使用基元數組通常可以更有效。就像你可以將你的結構的索引存儲在一個數組中並且對這些索引進行操作?