-1
我有一個相當簡單的cuda問題,看起來應該是一個簡單的操作:根據第二個布爾值數組從第一個數組中刪除元素。我採取的步驟是:Cuda/Thrust:remove_if不會更改device_vector.size()?
- 創建與處理的輸入數組大小相同的bools的device_vector。
- 調用將從(1)中設置一些元素爲真的內核
- 使用來自(2)的已處理數組的謂詞調用輸入數組上的remove_if。
- 對於設置爲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中刪除元素的特定方法?
你有沒有費力去閱讀remove_if的文檔? https://thrust.github.io/doc/group__stream__compaction.html#ga307d7f64566909172a3f9e16b7e2ad53 – talonmies
標題中提出的問題與問題中提出的問題不同(改變矢量的大小有所不同,因爲標題指示,並改變向量中包含的值,這兩個想法是不一樣的)。關於標題中提出的問題,毫無例外地,沒有推力**算法**(比如'remove_if'),它可以在任何地方*修改任何矢量大小。 –