2017-09-22 64 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); 

作为旁注,使用基元数组通常可以更有效。就像你可以将你的结构的索引存储在一个数组中并且对这些索引进行操作?