in thrust example, there code expand.cu. when want value, has shown error error: expression must modifiable lvalue
in line sx = d_output;
where wrong part? code this
#include <thrust/device_vector.h> #include <thrust/reduce.h> #include <thrust/gather.h> #include <thrust/scan.h> #include <thrust/fill.h> #include <thrust/copy.h> #include <iterator> #include <iostream> template <typename inputiterator1, typename inputiterator2, typename outputiterator> outputiterator expand(inputiterator1 first1, inputiterator1 last1, inputiterator2 first2, outputiterator output) { typedef typename thrust::iterator_difference<inputiterator1>::type difference_type; difference_type input_size = thrust::distance(first1, last1); difference_type output_size = thrust::reduce(first1, last1); // scan counts obtain output offsets each input element thrust::device_vector<difference_type> output_offsets(input_size, 0); thrust::exclusive_scan(first1, last1, output_offsets.begin()); // scatter nonzero counts corresponding output positions thrust::device_vector<difference_type> output_indices(output_size, 0); thrust::scatter_if (thrust::counting_iterator<difference_type>(0), thrust::counting_iterator<difference_type>(input_size), output_offsets.begin(), first1, output_indices.begin()); // compute max-scan on output indices, filling in holes thrust::inclusive_scan (output_indices.begin(), output_indices.end(), output_indices.begin(), thrust::maximum<difference_type>()); // gather input values according index array (output = first2[output_indices]) outputiterator output_end = output; thrust::advance(output_end, output_size); thrust::gather(output_indices.begin(), output_indices.end(), first2, output); // return output + output_size thrust::advance(output, output_size); return output; } int main(void) { int counts[] = {3,5,2,0,1,3,4,2,4}; int values[] = {1,2,3,4,5,6,7,8,9}; size_t input_size = sizeof(counts) / sizeof(int); size_t output_size = thrust::reduce(counts, counts + input_size); // copy inputs device thrust::device_vector<int> d_counts(counts, counts + input_size); thrust::device_vector<int> d_values(values, values + input_size); thrust::device_vector<int> d_output(output_size); // expand values according counts expand(d_counts.begin(), d_counts.end(), d_values.begin(), d_output.begin()); std::cout << "d_output: " ; for(int i=0; i<output_size; i++) std::cout << d_output[i] << " , "; //d::cout << d_output[i] << " , "; thrust::device_vector<int> sx[output_size]; //sx = d_output; thrust::copy(d_output.begin() , d_output.end(), sx.begin()); return 0; }
it should device vector of length output_size
as
thrust::device_vector<int> sx(output_size);
using []
means array of device vectors.
Comments
Post a Comment