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)
 
 ~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 503 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 505 of file flow_graph_opencl_node.h.

505 {}

◆ opencl_memory() [2/2]

◆ ~opencl_memory()

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

Definition at line 510 of file flow_graph_opencl_node.h.

510  {
511  if ( my_sending_event_present ) enforce_cl_retcode( clReleaseEvent( my_sending_event ), "Failed to release an event for the OpenCL buffer" );
512  enforce_cl_retcode( clReleaseMemObject( my_cl_mem ), "Failed to release an memory object" );
513  }
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 515 of file flow_graph_opencl_node.h.

515  {
516  return my_cl_mem;
517  }

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 519 of file flow_graph_opencl_node.h.

519  {
520  if ( !my_host_ptr ) {
521  opencl_async_msg<void*, Factory> d = receive( NULL );
522  d.data();
523  __TBB_ASSERT( d.data() == my_host_ptr, NULL );
524  }
525  return my_host_ptr;
526  }
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 530 of file flow_graph_opencl_node.h.

530  {
531  opencl_async_msg<void*, Factory> d;
532  if (e) {
533  d = opencl_async_msg<void*, Factory>(my_host_ptr, *e);
534  } else {
535  d = opencl_async_msg<void*, Factory>(my_host_ptr);
536  }
537 
538  // Concurrent receives are prohibited so we do not worry about synchronization.
540  map_memory(*my_factory->devices().begin(), d);
542  my_host_ptr = d.data(false);
543  }
544  // Release the sending event
546  enforce_cl_retcode(clReleaseEvent(my_sending_event), "Failed to release an event");
547  my_sending_event_present = false;
548  }
549  return d;
550  }
virtual void map_memory(opencl_device, opencl_async_msg< void *, Factory > &)=0
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
No ordering.
Definition: atomic.h:61
void enforce_cl_retcode(cl_int err, std::string msg)
tbb::atomic< opencl_device::device_id_type > my_curr_device_id

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 552 of file flow_graph_opencl_node.h.

552  {
553  opencl_device::device_id_type device_id = device.my_device_id;
554  if (!my_factory->is_same_context(my_curr_device_id.load<tbb::acquire>(), device_id)) {
555  {
557  if (!my_factory->is_same_context(my_curr_device_id.load<tbb::relaxed>(), device_id)) {
558  __TBB_ASSERT(my_host_ptr, "The buffer has not been mapped");
559  opencl_async_msg<void*, Factory> d(my_host_ptr);
560  my_factory->enqueue_unmap_buffer(device, *this, d);
561  my_sending_event = *d.get_event();
563  enforce_cl_retcode(clRetainEvent(my_sending_event), "Failed to retain an event");
564  my_host_ptr = NULL;
565  my_curr_device_id.store<tbb::release>(device_id);
566  }
567  }
569  }
570 
571  // !e means that buffer has come from the host
573 
574  __TBB_ASSERT(!my_host_ptr, "The buffer has not been unmapped");
575  return e ? opencl_async_msg<void*, Factory>(NULL, *e) : opencl_async_msg<void*, Factory>(NULL);
576  }
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
No ordering.
Definition: atomic.h:61
Represents acquisition of a mutex.
Definition: spin_mutex.h:53
Acquire.
Definition: atomic.h:57
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
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)
tbb::atomic< opencl_device::device_id_type > my_curr_device_id

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-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.