|
#include <thrust/device_vector.h> |
|
#include <thrust/copy.h> |
|
#include <thrust/iterator/constant_iterator.h> |
|
#include <thrust/reduce.h> |
|
|
|
#include <iostream> |
|
#include <iterator> |
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(void) |
|
{ |
|
|
|
const char data[] = "aaabbbbbcddeeeeeeeeeff"; |
|
|
|
const size_t N = (sizeof(data) / sizeof(char)) - 1; |
|
|
|
|
|
thrust::device_vector<char> input(data, data + N); |
|
|
|
|
|
thrust::device_vector<char> output(N); |
|
thrust::device_vector<int> lengths(N); |
|
|
|
|
|
std::cout << "input data:" << std::endl; |
|
thrust::copy(input.begin(), input.end(), std::ostream_iterator<char>(std::cout, "")); |
|
std::cout << std::endl << std::endl; |
|
|
|
|
|
size_t num_runs = thrust::reduce_by_key |
|
(input.begin(), input.end(), |
|
thrust::constant_iterator<int>(1), |
|
output.begin(), |
|
lengths.begin() |
|
).first - output.begin(); |
|
|
|
|
|
std::cout << "run-length encoded output:" << std::endl; |
|
for(size_t i = 0; i < num_runs; i++) |
|
std::cout << "(" << output[i] << "," << lengths[i] << ")"; |
|
std::cout << std::endl; |
|
|
|
return 0; |
|
} |
|
|
|
|