12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ==============================================================================*/
- #ifndef TENSORFLOW_CORE_UTIL_GUARDED_PHILOX_RANDOM_H_
- #define TENSORFLOW_CORE_UTIL_GUARDED_PHILOX_RANDOM_H_
- #include "philox_random.h"
- //#include "tensorflow/core/platform/mutex.h"
- //#include "tensorflow/core/platform/default/mutex.h"
- #include "tensorflow/core/platform/macros.h"
- #include "tensorflow/core/platform/types.h"
- namespace tensorflow {
- // A thread safe wrapper around a Philox generator. Example usage:
- //
- // GuardedRandomPhilox generator;
- // generator.Init(context);
- //
- // // In thread safe code
- // const int samples = ...;
- // auto local_generator = generator.ReserveSamples128(samples);
- // for (int i = 0; i < samples; i++)
- // Array<uint32, 4> sample = local_generator();
- // // Use sample
- // }
- //
- class GuardedPhiloxRandom {
- public:
- // Must call Init to finish initialization
- GuardedPhiloxRandom() : initialized_(false) {}
- // Initialize the generator from attributes "seed" and "seed2".
- // If both seeds are unspecified, use random seeds.
- // Must be called exactly once.
- // Initialize with given seeds.
- void Init(int64 seed, int64 seed2);
- void Init(random::PhiloxRandom::ResultType counter, random::PhiloxRandom::Key key);
- // Reserve a certain number of 128-bit samples.
- // This function is thread safe. The returned generator is valid for the
- // given number of samples, and can be used without a lock.
- random::PhiloxRandom ReserveSamples128(int64 samples);
- // Reserve a certain number of 32-bit samples.
- random::PhiloxRandom ReserveSamples32(int64 samples) {
- return ReserveSamples128((samples + 3) / 4);
- }
- // Reserve enough random samples in the generator for the given output count.
- random::PhiloxRandom ReserveRandomOutputs(int64 output_count, int multiplier) {
- int64 conservative_sample_count = output_count * multiplier;
- return ReserveSamples128(conservative_sample_count);
- }
- private:
- // mutex mu_;
- random::PhiloxRandom generator_; // GUARDED_BY(mu_);
- bool initialized_;
- TF_DISALLOW_COPY_AND_ASSIGN(GuardedPhiloxRandom);
- };
- } // namespace tensorflow
- #endif // TENSORFLOW_CORE_UTIL_GUARDED_PHILOX_RANDOM_H_
|