The Gaudi Framework  v41r0 (bdbe7744)
Loading...
Searching...
No Matches
Gaudi::CUDA::Stream Class Reference

#include </builds/gaudi/Gaudi/GaudiCUDA/include/Gaudi/CUDA/CUDAStream.h>

Collaboration diagram for Gaudi::CUDA::Stream:

Public Member Functions

 Stream (const Gaudi::Algorithm *parent, cudaStream_t stream)
 Wrap an existing cudaStream.
 Stream (const Gaudi::Algorithm *parent)
 Obtain a cudaStream from the pool.
 ~Stream ()
 operator cudaStream_t ()
 Access the internal cudaStream_t.
const Gaudi::Algorithm * parent ()
 Access the parent algorithm.
const Gaudi::AsynchronousAlgorithm * asyncParent ()
 Access the parent AsynchronousAlgorithm.
StatusCode await ()
 Yield fiber until stream is done.
void registerDependency ()
 INTERNAL: Register a dependency.
void removeDependency ()
 INTERNAL: Remove a dependency.

Private Attributes

cudaStream_t m_stream
const bool m_owning
const Gaudi::Algorithm * m_parent
const Gaudi::AsynchronousAlgorithm * m_async_parent
int m_dependents

Detailed Description

Definition at line 20 of file CUDAStream.h.

Constructor & Destructor Documentation

◆ Stream() [1/2]

Gaudi::CUDA::Stream::Stream ( const Gaudi::Algorithm * parent,
cudaStream_t stream )

Wrap an existing cudaStream.

Definition at line 78 of file CUDAStream.cpp.

79 : m_stream( stream )
80 , m_owning( stream == nullptr )
81 , m_parent( parent )
82 , m_async_parent( dynamic_cast<const Gaudi::AsynchronousAlgorithm*>( parent ) )
83 , m_dependents( 0 ) {}
const Gaudi::AsynchronousAlgorithm * m_async_parent
Definition CUDAStream.h:25
const bool m_owning
Definition CUDAStream.h:23
const Gaudi::Algorithm * parent()
Access the parent algorithm.
const Gaudi::Algorithm * m_parent
Definition CUDAStream.h:24
cudaStream_t m_stream
Definition CUDAStream.h:22

◆ Stream() [2/2]

Gaudi::CUDA::Stream::Stream ( const Gaudi::Algorithm * parent)

Obtain a cudaStream from the pool.

Definition at line 85 of file CUDAStream.cpp.

85 : Stream( parent, nullptr ) {
86 if ( !available_streams.pop( m_stream ) ) {
87 cudaError_t err = cudaStreamCreate( &m_stream );
88 if ( err != cudaSuccess ) {
89 cudaGetLastError();
90 throw GaudiException( err_fmt( err, __FILE__, __LINE__ ), "CUDAStreamException", StatusCode::FAILURE );
91 }
92 err = cudaStreamSynchronize( m_stream );
93 if ( err != cudaSuccess ) {
94 cudaGetLastError();
95 throw GaudiException( err_fmt( err, __FILE__, __LINE__ ), "CUDAStreamException", StatusCode::FAILURE );
96 }
97 }
98 }
Stream(const Gaudi::Algorithm *parent, cudaStream_t stream)
Wrap an existing cudaStream.
constexpr static const auto FAILURE
Definition StatusCode.h:100

◆ ~Stream()

Gaudi::CUDA::Stream::~Stream ( )

Definition at line 100 of file CUDAStream.cpp.

100 {
101 if ( m_dependents != 0 ) {
102 m_parent->error() << std::format( "Stream destroyed before all its dependents ({} remaining)", m_dependents )
103 << endmsg;
104 }
105 if ( await().isFailure() ) { m_parent->error() << "Error in Stream destructor" << endmsg; }
106 if ( m_owning ) { available_streams.push( m_stream ); }
107 }
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
StatusCode await()
Yield fiber until stream is done.

Member Function Documentation

◆ asyncParent()

const Gaudi::AsynchronousAlgorithm * Gaudi::CUDA::Stream::asyncParent ( )

Access the parent AsynchronousAlgorithm.

Definition at line 112 of file CUDAStream.cpp.

112{ return m_async_parent; }

◆ await()

StatusCode Gaudi::CUDA::Stream::await ( )

Yield fiber until stream is done.

Definition at line 114 of file CUDAStream.cpp.

114 {
115 auto temp_error = cudaSuccess;
116 if ( m_async_parent != nullptr ) {
117 auto sc = m_async_parent->decorateSuspension( [this, &temp_error]() {
118 auto res = boost::fibers::cuda::waitfor_all( m_stream );
119 temp_error = std::get<1>( res );
120 return StatusCode::SUCCESS;
121 } );
122 if ( !sc.isSuccess() ) {
123 m_parent->error() << "Error suspending on stream " << endmsg;
124 return sc;
125 }
126 } else {
127 temp_error = cudaStreamSynchronize( m_stream );
128 }
129 if ( ( temp_error ) != cudaSuccess ) {
130 cudaGetLastError();
131 std::string errmsg = err_fmt( temp_error, __FILE__, __LINE__ );
132 m_parent->error() << errmsg << endmsg;
133 return StatusCode::FAILURE;
134 }
135 return StatusCode::SUCCESS;
136 }
constexpr static const auto SUCCESS
Definition StatusCode.h:99

◆ operator cudaStream_t()

Gaudi::CUDA::Stream::operator cudaStream_t ( )

Access the internal cudaStream_t.

Definition at line 109 of file CUDAStream.cpp.

109{ return m_stream; }

◆ parent()

const Gaudi::Algorithm * Gaudi::CUDA::Stream::parent ( )

Access the parent algorithm.

Definition at line 111 of file CUDAStream.cpp.

111{ return m_parent; }

◆ registerDependency()

void Gaudi::CUDA::Stream::registerDependency ( )

INTERNAL: Register a dependency.

Definition at line 138 of file CUDAStream.cpp.

138{ ++m_dependents; }

◆ removeDependency()

void Gaudi::CUDA::Stream::removeDependency ( )

INTERNAL: Remove a dependency.

Definition at line 139 of file CUDAStream.cpp.

139{ --m_dependents; }

Member Data Documentation

◆ m_async_parent

const Gaudi::AsynchronousAlgorithm* Gaudi::CUDA::Stream::m_async_parent
private

Definition at line 25 of file CUDAStream.h.

◆ m_dependents

int Gaudi::CUDA::Stream::m_dependents
private

Definition at line 26 of file CUDAStream.h.

◆ m_owning

const bool Gaudi::CUDA::Stream::m_owning
private

Definition at line 23 of file CUDAStream.h.

◆ m_parent

const Gaudi::Algorithm* Gaudi::CUDA::Stream::m_parent
private

Definition at line 24 of file CUDAStream.h.

◆ m_stream

cudaStream_t Gaudi::CUDA::Stream::m_stream
private

Definition at line 22 of file CUDAStream.h.


The documentation for this class was generated from the following files: