Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::flow::interface10::opencl_memory< Factory > Class Template Referenceabstract

#include <flow_graph_opencl_node.h>

Inheritance diagram for tbb::flow::interface10::opencl_memory< Factory >:
Collaboration diagram for tbb::flow::interface10::opencl_memory< Factory >:

Public Member Functions

 opencl_memory ()
 
 opencl_memory (Factory &f)
 
 ~opencl_memory ()
 
cl_mem get_cl_mem () const
 
voidget_host_ptr ()
 
Factory * factory () const
 
opencl_async_msg< void *, Factory > receive (const cl_event *e)
 
opencl_async_msg< void *, Factory > send (opencl_device device, const cl_event *e)
 
virtual void map_memory (opencl_device, opencl_async_msg< void *, Factory > &)=0
 

Protected Attributes

cl_mem my_cl_mem
 
tbb::atomic< opencl_device::device_id_typemy_curr_device_id
 
voidmy_host_ptr
 
Factory * my_factory
 
tbb::spin_mutex my_sending_lock
 
bool my_sending_event_present
 
cl_event my_sending_event
 

Detailed Description

template<typename Factory>
class tbb::flow::interface10::opencl_memory< Factory >

Definition at line 504 of file flow_graph_opencl_node.h.

Constructor & Destructor Documentation

◆ opencl_memory() [1/2]

template<typename Factory>
tbb::flow::interface10::opencl_memory< Factory >::opencl_memory ( )
inline

Definition at line 506 of file flow_graph_opencl_node.h.

506 {}

◆ opencl_memory() [2/2]

◆ ~opencl_memory()

template<typename Factory>
tbb::flow::interface10::opencl_memory< Factory >::~opencl_memory ( )
inline

Member Function Documentation

◆ factory()

template<typename Factory>
Factory* tbb::flow::interface10::opencl_memory< Factory >::factory ( ) const
inline

◆ get_cl_mem()

◆ get_host_ptr()

template<typename Factory>
void* tbb::flow::interface10::opencl_memory< Factory >::get_host_ptr ( )
inline

Definition at line 520 of file flow_graph_opencl_node.h.

520  {
521  if ( !my_host_ptr ) {
522  opencl_async_msg<void*, Factory> d = receive( NULL );
523  d.data();
524  __TBB_ASSERT( d.data() == my_host_ptr, NULL );
525  }
526  return my_host_ptr;
527  }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:169
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
opencl_async_msg< void *, Factory > receive(const cl_event *e)

References __TBB_ASSERT, d, tbb::flow::interface10::opencl_memory< Factory >::my_host_ptr, and tbb::flow::interface10::opencl_memory< Factory >::receive().

Referenced by tbb::flow::interface10::opencl_factory< default_device_filter >::enqueue_unmap_buffer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ map_memory()

template<typename Factory>
virtual void tbb::flow::interface10::opencl_memory< Factory >::map_memory ( opencl_device  ,
opencl_async_msg< void *, Factory > &   
)
pure virtual

Implemented in tbb::flow::interface10::opencl_buffer_impl< Factory >.

Referenced by tbb::flow::interface10::opencl_memory< Factory >::receive().

Here is the caller graph for this function:

◆ receive()

template<typename Factory>
opencl_async_msg<void*, Factory> tbb::flow::interface10::opencl_memory< Factory >::receive ( const cl_event *  e)
inline

Definition at line 531 of file flow_graph_opencl_node.h.

531  {
532  opencl_async_msg<void*, Factory> d;
533  if (e) {
534  d = opencl_async_msg<void*, Factory>(my_host_ptr, *e);
535  } else {
536  d = opencl_async_msg<void*, Factory>(my_host_ptr);
537  }
538 
539  // Concurrent receives are prohibited so we do not worry about synchronization.
541  map_memory(*my_factory->devices().begin(), d);
543  my_host_ptr = d.data(false);
544  }
545  // Release the sending event
547  enforce_cl_retcode(clReleaseEvent(my_sending_event), "Failed to release an event");
548  my_sending_event_present = false;
549  }
550  return d;
551  }
No ordering.
Definition: atomic.h:51
tbb::atomic< opencl_device::device_id_type > my_curr_device_id
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
value_type load() const
Definition: atomic.h:306
void enforce_cl_retcode(cl_int err, std::string msg)
virtual void map_memory(opencl_device, opencl_async_msg< void *, Factory > &)=0
void store(value_type value)
Definition: atomic.h:317

References d, tbb::flow::interface10::enforce_cl_retcode(), tbb::flow::interface10::opencl_device::host, tbb::internal::atomic_impl< T >::load(), tbb::flow::interface10::opencl_memory< Factory >::map_memory(), tbb::flow::interface10::opencl_memory< Factory >::my_curr_device_id, tbb::flow::interface10::opencl_memory< Factory >::my_factory, tbb::flow::interface10::opencl_memory< Factory >::my_host_ptr, tbb::flow::interface10::opencl_memory< Factory >::my_sending_event, tbb::flow::interface10::opencl_memory< Factory >::my_sending_event_present, tbb::relaxed, and tbb::internal::atomic_impl< T >::store().

Referenced by tbb::flow::interface10::opencl_memory< Factory >::get_host_ptr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ send()

template<typename Factory>
opencl_async_msg<void*, Factory> tbb::flow::interface10::opencl_memory< Factory >::send ( opencl_device  device,
const cl_event *  e 
)
inline

Definition at line 553 of file flow_graph_opencl_node.h.

553  {
554  opencl_device::device_id_type device_id = device.my_device_id;
555  if (!my_factory->is_same_context(my_curr_device_id.load<tbb::acquire>(), device_id)) {
556  {
558  if (!my_factory->is_same_context(my_curr_device_id.load<tbb::relaxed>(), device_id)) {
559  __TBB_ASSERT(my_host_ptr, "The buffer has not been mapped");
560  opencl_async_msg<void*, Factory> d(my_host_ptr);
561  my_factory->enqueue_unmap_buffer(device, *this, d);
562  my_sending_event = *d.get_event();
564  enforce_cl_retcode(clRetainEvent(my_sending_event), "Failed to retain an event");
565  my_host_ptr = NULL;
567  }
568  }
570  }
571 
572  // !e means that buffer has come from the host
574 
575  __TBB_ASSERT(!my_host_ptr, "The buffer has not been unmapped");
576  return e ? opencl_async_msg<void*, Factory>(NULL, *e) : opencl_async_msg<void*, Factory>(NULL);
577  }
No ordering.
Definition: atomic.h:51
tbb::atomic< opencl_device::device_id_type > my_curr_device_id
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:169
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
Acquire.
Definition: atomic.h:47
value_type load() const
Definition: atomic.h:306
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock
void enforce_cl_retcode(cl_int err, std::string msg)
Represents acquisition of a mutex.
Definition: spin_mutex.h:54
void store(value_type value)
Definition: atomic.h:317
Release.
Definition: atomic.h:49

References __TBB_ASSERT, tbb::acquire, d, tbb::flow::interface10::enforce_cl_retcode(), tbb::internal::atomic_impl< T >::load(), lock, tbb::flow::interface10::opencl_memory< Factory >::my_curr_device_id, tbb::flow::interface10::opencl_device::my_device_id, tbb::flow::interface10::opencl_memory< Factory >::my_factory, tbb::flow::interface10::opencl_memory< Factory >::my_host_ptr, tbb::flow::interface10::opencl_memory< Factory >::my_sending_event, tbb::flow::interface10::opencl_memory< Factory >::my_sending_event_present, tbb::flow::interface10::opencl_memory< Factory >::my_sending_lock, tbb::relaxed, tbb::release, and tbb::internal::atomic_impl< T >::store().

Here is the call graph for this function:

Member Data Documentation

◆ my_cl_mem

◆ my_curr_device_id

◆ my_factory

◆ my_host_ptr

◆ my_sending_event

◆ my_sending_event_present

◆ my_sending_lock

template<typename Factory>
tbb::spin_mutex tbb::flow::interface10::opencl_memory< Factory >::my_sending_lock
protected

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

Copyright © 2005-2019 Intel Corporation. All Rights Reserved.

Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are registered trademarks or trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

* Other names and brands may be claimed as the property of others.