Проблема с уплотнением массива CUDA с использованием thrust zip_iterator

У меня непонятная ошибка при попытке сжать несколько массивов CUDA с помощью итератора thrust zip. Мой случай прост: у меня есть целые числа thrust::vector, указывающие состояние объекта, и шесть векторов с плавающей точкой, указывающие положение и скорость объекта в 3D. Когда значение элемента вектора status (целое число) равно 1, я хочу удалить элемент из всех векторов и сжать векторы.

Следуя этому примеру, я использую кортеж с 7 путями и предикат.

// Predicate
struct isTupleFlagged
{
    __host__ __device__ bool operator() ( const PartTuple& tup )
    {
        const int x = thrust::get<0>( tup );
        return ( x == 1 );
    }
};

void ParticleSystem::RemoveFlaggedParticles()
{
        typedef thrust::device_vector< int >::iterator  IntDIter;
        typedef thrust::device_vector< float >::iterator  FloatDIter;
        typedef thrust::tuple< IntDIter, FloatDIter, FloatDIter, FloatDIter, FloatDIter, FloatDIter, FloatDIter >     PartDIterTuple;
        typedef thrust::zip_iterator< PartDIterTuple >  ZipDIter;

        ZipDIter newEnd = thrust::remove_if(    thrust::make_zip_iterator( thrust::make_tuple( exit.begin(), x.begin(), y.begin(), z.begin(), vx.begin(), vy.begin(), vz.begin() ) ),
                                                thrust::make_zip_iterator( thrust::make_tuple( exit.end(), x.end(), y.end(), z.end(), vx.end(), vy.end(), vz.end() ) ),
                                                isTupleFlagged() );

        PartDIterTuple endTuple = newEnd.get_iterator_tuple();
        exit.erase(thrust::get<0>( endTuple ), exit.end());
        x.erase( thrust::get<1>( endTuple ), x.end() );
        y.erase( thrust::get<2>( endTuple ), y.end() );
        z.erase( thrust::get<3>( endTuple ), z.end() );
        vx.erase( thrust::get<4>( endTuple ), vx.end() );
        vy.erase( thrust::get<5>( endTuple ), vy.end() );
        vz.erase( thrust::get<6>( endTuple ), vz.end() );

}

Однако это, кажется, ошибочно удаляет лишние элементы. Например, когда в векторе 100 имеется один помеченный объект, размер векторов после сжатия будет 52, а не 99, как можно было бы ожидать. Что я пропустил?

0 ответов

Другие вопросы по тегам