Home ⌂Doc Index ◂Up ▴
Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::flow::interface11::opencl_memory< Factory > Class Template Referenceabstract

#include <flow_graph_opencl_node.h>

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

Public Member Functions

 opencl_memory ()
 
 opencl_memory (Factory &f)
 
virtual ~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::interface11::opencl_memory< Factory >

Definition at line 514 of file flow_graph_opencl_node.h.

Constructor & Destructor Documentation

◆ opencl_memory() [1/2]

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

Definition at line 516 of file flow_graph_opencl_node.h.

516 {}

◆ opencl_memory() [2/2]

◆ ~opencl_memory()

template<typename Factory>
virtual tbb::flow::interface11::opencl_memory< Factory >::~opencl_memory ( )
inlinevirtual

Definition at line 521 of file flow_graph_opencl_node.h.

521  {
522  if ( my_sending_event_present ) enforce_cl_retcode( clReleaseEvent( my_sending_event ), "Failed to release an event for the OpenCL buffer" );
523  enforce_cl_retcode( clReleaseMemObject( my_cl_mem ), "Failed to release an memory object" );
524  }
void enforce_cl_retcode(cl_int err, std::string msg)

References tbb::flow::interface11::enforce_cl_retcode(), tbb::flow::interface11::opencl_memory< Factory >::my_cl_mem, tbb::flow::interface11::opencl_memory< Factory >::my_sending_event, and tbb::flow::interface11::opencl_memory< Factory >::my_sending_event_present.

Here is the call graph for this function:

Member Function Documentation

◆ factory()

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

◆ get_cl_mem()

template<typename Factory>
cl_mem tbb::flow::interface11::opencl_memory< Factory >::get_cl_mem ( ) const
inline

Definition at line 526 of file flow_graph_opencl_node.h.

526  {
527  return my_cl_mem;
528  }

References tbb::flow::interface11::opencl_memory< Factory >::my_cl_mem.

Referenced by tbb::flow::interface11::opencl_factory< default_device_filter >::enqueue_map_buffer(), and tbb::flow::interface11::opencl_factory< default_device_filter >::enqueue_unmap_buffer().

Here is the caller graph for this function:

◆ get_host_ptr()

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

Definition at line 530 of file flow_graph_opencl_node.h.

530  {
531  if ( !my_host_ptr ) {
532  opencl_async_msg<void*, Factory> d = receive( NULL );
533  d.data();
534  __TBB_ASSERT( d.data() == my_host_ptr, NULL );
535  }
536  return my_host_ptr;
537  }
opencl_async_msg< void *, Factory > receive(const cl_event *e)
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
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

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

Referenced by tbb::flow::interface11::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::interface11::opencl_memory< Factory >::map_memory ( opencl_device  ,
opencl_async_msg< void *, Factory > &   
)
pure virtual

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

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

Here is the caller graph for this function:

◆ receive()

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

Definition at line 541 of file flow_graph_opencl_node.h.

541  {
542  opencl_async_msg<void*, Factory> d;
543  if (e) {
544  d = opencl_async_msg<void*, Factory>(my_host_ptr, *e);
545  } else {
546  d = opencl_async_msg<void*, Factory>(my_host_ptr);
547  }
548 
549  // Concurrent receives are prohibited so we do not worry about synchronization.
551  map_memory(*my_factory->devices().begin(), d);
553  my_host_ptr = d.data(false);
554  }
555  // Release the sending event
557  enforce_cl_retcode(clReleaseEvent(my_sending_event), "Failed to release an event");
558  my_sending_event_present = false;
559  }
560  return d;
561  }
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
virtual void map_memory(opencl_device, opencl_async_msg< void *, Factory > &)=0
No ordering.
Definition: atomic.h:61
void enforce_cl_retcode(cl_int err, std::string msg)

References d, tbb::flow::interface11::enforce_cl_retcode(), tbb::flow::interface11::opencl_device::host, tbb::flow::interface11::opencl_memory< Factory >::map_memory(), tbb::flow::interface11::opencl_memory< Factory >::my_curr_device_id, tbb::flow::interface11::opencl_memory< Factory >::my_factory, tbb::flow::interface11::opencl_memory< Factory >::my_host_ptr, tbb::flow::interface11::opencl_memory< Factory >::my_sending_event, tbb::flow::interface11::opencl_memory< Factory >::my_sending_event_present, and tbb::relaxed.

Referenced by tbb::flow::interface11::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::interface11::opencl_memory< Factory >::send ( opencl_device  device,
const cl_event *  e 
)
inline

Definition at line 563 of file flow_graph_opencl_node.h.

563  {
564  opencl_device::device_id_type device_id = device.my_device_id;
565  if (!my_factory->is_same_context(my_curr_device_id.load<tbb::acquire>(), device_id)) {
566  {
568  if (!my_factory->is_same_context(my_curr_device_id.load<tbb::relaxed>(), device_id)) {
569  __TBB_ASSERT(my_host_ptr, "The buffer has not been mapped");
570  opencl_async_msg<void*, Factory> d(my_host_ptr);
571  my_factory->enqueue_unmap_buffer(device, *this, d);
572  my_sending_event = *d.get_event();
574  enforce_cl_retcode(clRetainEvent(my_sending_event), "Failed to retain an event");
575  my_host_ptr = NULL;
576  my_curr_device_id.store<tbb::release>(device_id);
577  }
578  }
580  }
581 
582  // !e means that buffer has come from the host
584 
585  __TBB_ASSERT(!my_host_ptr, "The buffer has not been unmapped");
586  return e ? opencl_async_msg<void*, Factory>(NULL, *e) : opencl_async_msg<void*, Factory>(NULL);
587  }
tbb::atomic< opencl_device::device_id_type > my_curr_device_id
Release.
Definition: atomic.h:59
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
Represents acquisition of a mutex.
Definition: spin_mutex.h:53
No ordering.
Definition: atomic.h:61
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
void enforce_cl_retcode(cl_int err, std::string msg)
Acquire.
Definition: atomic.h:57
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

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

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::interface11::opencl_memory< Factory >::my_sending_lock
protected

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

Copyright © 2005-2020 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.