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
Хорошо, я попробовал это, но я получаю ошибку 'Ошибка ошибка: нет экземпляра перегруженной функции« thrust :: copy_if »соответствует списку аргументов – ragnar
Прохладный, похоже, что он работает. Есть ли какая-либо документация о том, как работают «толчок :: заполнители»? Кроме того, что является лучшим способом сделать трехмерный итератор, который выполняет итерацию вместе с 1-мерным итератором. т. е. я хочу знать трехмерные координаты, но представляется бесполезным преобразовать обратно к одному индексу просто для доступа к линейной памяти. – ragnar
@ragnar: Возможно, вы можете использовать 'transform_iterator' для преобразования линейного индекса в многомерные координаты. –