| | #pragma once |
| |
|
| | #include <thrust/iterator/counting_iterator.h> |
| | #include <thrust/transform.h> |
| |
|
| | struct hash32 |
| | { |
| | __host__ __device__ |
| | unsigned int operator()(unsigned int h) const |
| | { |
| | h = ~h + (h << 15); |
| | h = h ^ (h >> 12); |
| | h = h + (h << 2); |
| | h = h ^ (h >> 4); |
| | h = h + (h << 3) + (h << 11); |
| | h = h ^ (h >> 16); |
| | return h; |
| | } |
| | }; |
| |
|
| | struct hash64 |
| | { |
| | __host__ __device__ |
| | unsigned long long operator()(unsigned long long h) const |
| | { |
| | h = ~h + (h << 21); |
| | h = h ^ (h >> 24); |
| | h = (h + (h << 3)) + (h << 8); |
| | h = h ^ (h >> 14); |
| | h = (h + (h << 2)) + (h << 4); |
| | h = h ^ (h >> 28); |
| | h = h + (h << 31); |
| | return h; |
| | } |
| | }; |
| |
|
| | struct hashtofloat |
| | { |
| | __host__ __device__ |
| | float operator()(unsigned int h) const |
| | { |
| | return static_cast<float>(hash32()(h)) / 4294967296.0f; |
| | } |
| | }; |
| |
|
| | struct hashtodouble |
| | { |
| | __host__ __device__ |
| | double operator()(unsigned long long h) const |
| | { |
| | return static_cast<double>(hash64()(h)) / 18446744073709551616.0; |
| | } |
| | }; |
| |
|
| |
|
| |
|
| | template <typename Vector, typename T> |
| | void _randomize(Vector& v, T) |
| | { |
| | thrust::transform(thrust::counting_iterator<unsigned int>(0), |
| | thrust::counting_iterator<unsigned int>(0) + v.size(), |
| | v.begin(), |
| | hash32()); |
| | } |
| |
|
| | template <typename Vector> |
| | void _randomize(Vector& v, long long) |
| | { |
| | thrust::transform(thrust::counting_iterator<unsigned long long>(0), |
| | thrust::counting_iterator<unsigned long long>(0) + v.size(), |
| | v.begin(), |
| | hash64()); |
| | } |
| |
|
| | template <typename Vector> |
| | void _randomize(Vector& v, float) |
| | { |
| | thrust::transform(thrust::counting_iterator<unsigned int>(0), |
| | thrust::counting_iterator<unsigned int>(0) + v.size(), |
| | v.begin(), |
| | hashtofloat()); |
| | } |
| |
|
| | template <typename Vector> |
| | void _randomize(Vector& v, double) |
| | { |
| | thrust::transform(thrust::counting_iterator<unsigned long long>(0), |
| | thrust::counting_iterator<unsigned long long>(0) + v.size(), |
| | v.begin(), |
| | hashtodouble()); |
| | } |
| |
|
| | |
| | template <typename Vector> |
| | void randomize(Vector& v) |
| | { |
| | _randomize(v, typename Vector::value_type()); |
| | } |
| |
|
| |
|
| |
|