Cuda / Thrust:remove_if不会改变device_vector.size()?

时间:2017-09-22 22:47:03

标签: cuda thrust

我有一个相当简单的cuda问题似乎应该是一个简单的操作:根据第二个bool数组的值从1个数组中删除元素。我采取的步骤是:

  1. 创建一个bool的device_vector,其大小与已处理的输入数组相同。
  2. 调用内核,将某些元素从(1)设置为true
  3. 使用来自(2)的已处理数组的谓词调用输入数组上的remove_if。
  4. 对于bool数组中设置为true的每个值,从输入数组中删除相应的元素。
  5. 我所看到的是输入数组没有改变,我不知道为什么?

    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并输出成员。我可以验证已删除的条目是否正确填充了真实和虚假。

    我的期望是testEntries会有0个元素。但它没有,我得到一个输出,好像remove_if没有做任何事情。即:输出显示输入数组中的所有元素。我不知道为什么?是否有一种从device_vector中删除元素的特定方法?

1 个答案:

答案 0 :(得分:1)

所以你需要捕获从remove_if

返回的迭代器
await.

然后当您将数据复制回主机而不是使用推力时,主机和设备之间的默认分配运算符执行此操作:

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

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