| #include "caffe2/core/context.h" |
| |
| #include <atomic> |
| #if defined(_MSC_VER) |
| #include <process.h> |
| #endif |
| |
| namespace caffe2 { |
| |
| uint32_t RandomNumberSeed() { |
| // Originally copied from folly::randomNumberSeed (at 418ad4) |
| // modified to use chrono instead of sys/time.h |
| static std::atomic<uint32_t> seedInput(0); |
| auto tv = std::chrono::system_clock::now().time_since_epoch(); |
| uint64_t usec = static_cast<uint64_t>( |
| std::chrono::duration_cast<std::chrono::microseconds>(tv).count()); |
| uint32_t tv_sec = usec / 1000000; |
| uint32_t tv_usec = usec % 1000000; |
| const uint32_t kPrime0 = 51551; |
| const uint32_t kPrime1 = 61631; |
| const uint32_t kPrime2 = 64997; |
| const uint32_t kPrime3 = 111857; |
| return kPrime0 * (seedInput++) + kPrime1 * static_cast<uint32_t>(getpid()) + |
| kPrime2 * tv_sec + kPrime3 * tv_usec; |
| } |
| |
| namespace { |
| inline void CopyBytesImpl(size_t nbytes, const void* src, void* dst) { |
| if (nbytes == 0) { |
| return; |
| } |
| CAFFE_ENFORCE(src); |
| CAFFE_ENFORCE(dst); |
| memcpy(dst, src, nbytes); |
| } |
| |
| void CopyBytesWrapper( |
| size_t nbytes, |
| const void* src, |
| Device src_device, |
| void* dst, |
| Device dst_device) { |
| CopyBytesImpl(nbytes, src, dst); |
| } |
| } // namespace |
| |
| void CPUContext::CopyBytesSameDevice( |
| size_t nbytes, |
| const void* src, |
| void* dst) { |
| CopyBytesImpl(nbytes, src, dst); |
| } |
| |
| } // namespace caffe2 |
| |
| namespace at { |
| |
| REGISTER_CONTEXT(DeviceType::CPU, caffe2::CPUContext); |
| |
| REGISTER_COPY_BYTES_FUNCTION( |
| DeviceType::CPU, |
| DeviceType::CPU, |
| caffe2::CopyBytesWrapper); |
| } // namespace at |