Cuda/推力:如果没有,则移除#x27;t更改设备_vector.size()?

Cuda/推力:如果没有,则移除#x27;t更改设备_vector.size()?,cuda,thrust,Cuda,Thrust,我有一个相当简单的cuda问题,看起来应该是一个简单的操作:根据第二个布尔数组的值从1个数组中删除元素。我采取的步骤是: 创建一个与处理后的输入数组大小相同的布尔向量 调用内核,它将把(1)中的一些元素设置为true 如果使用(2)中的已处理数组对具有谓词的输入数组调用remove_ 对于bool数组中设置为true的每个值,从输入数组中删除相应的元素 我看到的是,输入数组没有改变,我不知道为什么 struct EntryWasDeleted { __device__ __host__

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

  • 创建一个与处理后的输入数组大小相同的布尔向量
  • 调用内核,它将把(1)中的一些元素设置为true
  • 如果使用(2)中的已处理数组对具有谓词的输入数组调用remove_
  • 对于bool数组中设置为true的每个值,从输入数组中删除相应的元素
  • 我看到的是,输入数组没有改变,我不知道为什么

    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); }
    
    struct entrywasdelected
    {
    __设备主机__
    布尔运算符()(常量布尔如果已删除)
    {返回true;}
    };
    //这个数组大约有200-300个元素
    //推力::设备_向量和阵列删除
    推力::设备向量*deletedEntries=
    新推力::设备_向量(arrayToDelete.size(),false);
    cuDeleteTestEntries(推力::原始指针转换(arrayToDelete.data())、countToDelete、heapAccess、推力::原始指针转换(deletedEntries->data());
    cudaDeviceSynchronize();
    推力::删除_if(arraytodele.begin(),arraytodele.end(),deletedEntries->begin(),entrywasdelected());
    //我希望testEntries包含0个元素
    推力::主机\向量testEntries=arrayToDelete;
    
    对于(inti=0;i,因此需要捕获从remove\u返回的迭代器,如果

    thrust::device_vector<SomeStruct>::iterator endIterator = 
       thrust::remove_if(arrayToDelete.begin(), arrayToDelete.end(), 
    deletedEntries->begin(), EntryWasDeleted());    
    
    推力::设备\向量::迭代器endIterator=
    推力::如果(arrayToDelete.begin(),arrayToDelete.end(),则删除,
    deletedEntries->begin(),EntryWasDeleted());
    
    然后,当您将数据复制回主机而不是在主机和设备之间使用“插入默认分配”操作符时,请执行以下操作:

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

    作为补充说明,使用基元数组通常效率更高。例如,您可以将结构的索引存储在数组中,然后对这些索引进行操作吗?

    您是否费心阅读文档以删除?如果?标题中提出的问题与问题中提出的问题不同(如标题所示,更改向量大小与更改向量中包含的值之间存在差异。这两种想法不一样)。关于标题中提出的问题,毫无例外,没有任何推力算法(如
    remove\u if
    )可以在任何地方修改任何向量大小。