2012-03-15 2 views
2

Как я могу использовать thrust для возврата индексов активных элементов массива, т.е. вернуть вектор индексов, в которых элементы массива равны 1?Thrust: Как возвращать индексы активных элементов массива

Расширяя это, как это будет работать в случае многомерных индексов, заданных размерами массива?

Edit: В настоящее время функция выглядит следующим образом

template<class VoxelType> 
void VoxelVolumeT<VoxelType>::cudaThrustReduce(VoxelType *cuda_voxels) 
{ 
    device_ptr<VoxelType> cuda_voxels_ptr(cuda_voxels); 

    int active_voxel_count = thrust::count(cuda_voxels_ptr, cuda_voxels_ptr + dim.x*dim.y*dim.z, 1); 

    device_vector<VoxelType> active_voxels; 

    thrust::copy_if(make_counting_iterator(0), 
        make_counting_iterator(dim.x*dim.y*dim.z), 
        cuda_voxels_ptr, 
        active_voxels.begin(), 
        _1 == 1); 
} 

Что дает ошибку

Error 15 error : no instance of overloaded function "thrust::copy_if" matches the argument list 

ответ

3

Комбинат counting_iterator с copy_if:

#include <thrust/copy.h> 
#include <thrust/iterator/counting_iterator.h> 
#include <thrust/functional.h> 
... 
using namespace thrust; 
using namespace thrust::placeholders; 

copy_if(make_counting_iterator<int>(0), 
     make_counting_iterator<int>(array.size()), // indices from 0 to N 
     array.begin(),        // array data 
     active_indices.begin(),     // result will be written here 
     _1 == 1);         // return when an element or array is equal to 1 
+0

Хорошо, я попробовал это, но я получаю ошибку 'Ошибка ошибка: нет экземпляра перегруженной функции« thrust :: copy_if »соответствует списку аргументов – ragnar

+0

Прохладный, похоже, что он работает. Есть ли какая-либо документация о том, как работают «толчок :: заполнители»? Кроме того, что является лучшим способом сделать трехмерный итератор, который выполняет итерацию вместе с 1-мерным итератором. т. е. я хочу знать трехмерные координаты, но представляется бесполезным преобразовать обратно к одному индексу просто для доступа к линейной памяти. – ragnar

+0

@ragnar: Возможно, вы можете использовать 'transform_iterator' для преобразования линейного индекса в многомерные координаты. –

Смежные вопросы