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]

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

Definition at line 506 of file flow_graph_opencl_node.h.

506  : my_host_ptr( NULL ), my_factory( &f ), my_sending_event_present( false ) {
507  my_curr_device_id = my_factory->devices().begin()->my_device_id;
508  }
tbb::atomic< opencl_device::device_id_type > my_curr_device_id

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

References tbb::flow::interface11::enforce_cl_retcode().

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

Definition at line 528 of file flow_graph_opencl_node.h.

◆ get_cl_mem()

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

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

References __TBB_ASSERT, and tbb::flow::interface11::opencl_async_msg< T, Factory >::data().

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

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)
#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
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

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

References d, tbb::flow::interface11::opencl_async_msg< T, Factory >::data(), tbb::flow::interface11::enforce_cl_retcode(), tbb::flow::interface11::opencl_device::host, and tbb::relaxed.

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  }
void enforce_cl_retcode(cl_int err, std::string msg)
tbb::atomic< opencl_device::device_id_type > my_curr_device_id
No ordering.
Definition: atomic.h:61
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
Here is the call 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.

References __TBB_ASSERT, tbb::acquire, d, tbb::flow::interface11::enforce_cl_retcode(), tbb::flow::interface11::opencl_async_msg< T, Factory >::get_event(), lock, tbb::flow::interface11::opencl_device::my_device_id, tbb::relaxed, and tbb::release.

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  }
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
Represents acquisition of a mutex.
Definition: spin_mutex.h:53
void enforce_cl_retcode(cl_int err, std::string msg)
Release.
Definition: atomic.h:59
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:165
No ordering.
Definition: atomic.h:61
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:57
Here is the call graph for this function:

Member Data Documentation

◆ my_cl_mem

template<typename Factory>
cl_mem tbb::flow::interface11::opencl_memory< Factory >::my_cl_mem
protected

Definition at line 580 of file flow_graph_opencl_node.h.

◆ my_curr_device_id

template<typename Factory>
tbb::atomic<opencl_device::device_id_type> tbb::flow::interface11::opencl_memory< Factory >::my_curr_device_id
protected

Definition at line 581 of file flow_graph_opencl_node.h.

◆ my_factory

template<typename Factory>
Factory* tbb::flow::interface11::opencl_memory< Factory >::my_factory
protected

Definition at line 583 of file flow_graph_opencl_node.h.

◆ my_host_ptr

template<typename Factory>
void* tbb::flow::interface11::opencl_memory< Factory >::my_host_ptr
protected

Definition at line 582 of file flow_graph_opencl_node.h.

◆ my_sending_event

template<typename Factory>
cl_event tbb::flow::interface11::opencl_memory< Factory >::my_sending_event
protected

Definition at line 587 of file flow_graph_opencl_node.h.

◆ my_sending_event_present

template<typename Factory>
bool tbb::flow::interface11::opencl_memory< Factory >::my_sending_event_present
protected

Definition at line 586 of file flow_graph_opencl_node.h.

◆ my_sending_lock

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

Definition at line 585 of file flow_graph_opencl_node.h.


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.