-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'),它可以在任何地方*修改任何矢量大小。 –