35 using Scalar = Scalar_;
39 explicit DeviceScalar(cudaStream_t stream =
nullptr) : d_val_(sizeof(Scalar)), stream_(stream) {}
41 DeviceScalar(Scalar host_val, cudaStream_t stream) : d_val_(sizeof(Scalar)), stream_(stream) {
42 EIGEN_CUDA_RUNTIME_CHECK(cudaMemcpyAsync(d_val_.get(), &host_val,
sizeof(Scalar), cudaMemcpyHostToDevice, stream_));
49 d_val_ = std::move(o.d_val_);
61 EIGEN_CUDA_RUNTIME_CHECK(
62 cudaMemcpyAsync(d_val_.get(), o.d_val_.get(),
sizeof(Scalar), cudaMemcpyDeviceToDevice, stream_));
76 EIGEN_CUDA_RUNTIME_CHECK(cudaMemcpyAsync(&result, d_val_.get(),
sizeof(Scalar), cudaMemcpyDeviceToHost, stream_));
77 EIGEN_CUDA_RUNTIME_CHECK(cudaStreamSynchronize(stream_));
83 operator Scalar()
const {
return get(); }
85 Scalar* devicePtr() {
return static_cast<Scalar*
>(d_val_.get()); }
86 const Scalar* devicePtr()
const {
return static_cast<const Scalar*
>(d_val_.get()); }
87 cudaStream_t stream()
const {
return stream_; }
96 eigen_assert(a.stream_ == b.stream_ &&
"DeviceScalar operator/: operands must share the same stream");
98 gpu::internal::device_scalar_div(a.devicePtr(), b.devicePtr(), result.devicePtr(), a.stream_);
114 gpu::internal::device_scalar_neg(devicePtr(), result.devicePtr(), stream_);
119 internal::DeviceBuffer d_val_;
120 cudaStream_t stream_ =
nullptr;