Skip to content

Commit 7468a0b

Browse files
committed
Use thrust to generate random numbers.
1 parent 7efaf03 commit 7468a0b

File tree

2 files changed

+17
-99
lines changed

2 files changed

+17
-99
lines changed

src/gpu/matrix/KmMatrix/Generator.cuh

+17-36
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
#include <thrust/random.h>
77
#include <random>
88

9-
#include <curand_kernel.h>
10-
119
#include "Generator.hpp"
1210
#include "KmMatrix.hpp"
1311
#include "../../utils/utils.cuh"
@@ -16,25 +14,9 @@
1614
namespace h2o4gpu {
1715
namespace Matrix {
1816

19-
namespace kernel {
20-
// Split the definition to avoid multiple definition.
21-
__global__ void setup_random_states(int _seed, curandState *_state,
22-
size_t _size);
23-
24-
__global__ void generate_uniform_kernel(float *_res,
25-
curandState *_state,
26-
int _size);
27-
28-
__global__ void generate_uniform_kernel(double *_res,
29-
curandState *_state,
30-
int _size);
31-
}
32-
3317
template <typename T>
3418
struct UniformGenerator : public GeneratorBase<T> {
3519
private:
36-
// FIXME: Use KmMatrix
37-
curandState *dev_states_;
3820
size_t size_;
3921
// FIXME: Cache random_numbers_ in a safer way.
4022
KmMatrix<T> random_numbers_;
@@ -43,45 +25,44 @@ struct UniformGenerator : public GeneratorBase<T> {
4325
void initialize (size_t _size) {
4426
size_ = _size;
4527
random_numbers_ = KmMatrix<T> (1, size_);
46-
47-
if (dev_states_ != nullptr) {
48-
safe_cuda(cudaFree(dev_states_));
49-
}
50-
safe_cuda(cudaMalloc((void **)&dev_states_, size_ * sizeof(curandState)));
51-
kernel::setup_random_states<<<div_roundup(size_, 256), 256>>>(
52-
seed_, dev_states_, size_);
5328
}
5429

5530
public:
56-
UniformGenerator() : dev_states_ (nullptr), size_ (0) {
31+
UniformGenerator() : size_ (0) {
5732
std::random_device rd;
5833
seed_ = rd();
5934
}
6035

61-
UniformGenerator (size_t _size, int _seed) {
36+
UniformGenerator (size_t _size, int _seed) : seed_(_seed) {
6237
if (_size == 0) {
6338
h2o4gpu_error("Zero size for generate is not allowed.");
6439
}
6540
initialize(_size);
6641
}
6742

6843
UniformGenerator(int _seed) :
69-
seed_(_seed), dev_states_(nullptr), size_ (0) {}
44+
seed_(_seed), size_ (0) {}
7045

71-
~UniformGenerator () {
72-
if (dev_states_ != nullptr) {
73-
safe_cuda(cudaFree(dev_states_));
74-
}
75-
}
46+
~UniformGenerator () {}
7647

7748
UniformGenerator(const UniformGenerator<T>& _rhs) = delete;
7849
UniformGenerator(UniformGenerator<T>&& _rhs) = delete;
7950
void operator=(const UniformGenerator<T>& _rhs) = delete;
8051
void operator=(UniformGenerator<T>&& _rhs) = delete;
8152

8253
KmMatrix<T> generate() override {
83-
kernel::generate_uniform_kernel<<<div_roundup(size_, 256), 256>>>
84-
(random_numbers_.k_param().ptr, dev_states_, size_);
54+
thrust::device_ptr<T> rn_ptr (random_numbers_.dev_ptr());
55+
thrust::transform(
56+
thrust::make_counting_iterator((size_t)0),
57+
thrust::make_counting_iterator(size_),
58+
rn_ptr,
59+
[=] __device__ (int idx) {
60+
thrust::default_random_engine rng(seed_);
61+
thrust::uniform_real_distribution<T> dist;
62+
rng.discard(idx);
63+
return dist(rng);
64+
});
65+
8566
return random_numbers_;
8667
}
8768

@@ -95,6 +76,6 @@ struct UniformGenerator : public GeneratorBase<T> {
9576
return generate();
9677
}
9778
};
98-
79+
9980
} // namespace h2o4gpu
10081
} // namespace Matrix

src/gpu/matrix/KmMatrix/GeneratorKernels.cu

-63
This file was deleted.

0 commit comments

Comments
 (0)