code: public void registerProfileReportObserver(IProfileReportObserver observer) {
        KernelProfile profile = KernelManager.instance().getProfile(getClass());
        synchronized (profile) {
      	  profile.setReportObserver(observer);
        }	   
     }
docs: Registers a new profile report observer to receive profile reports as they're produced.
  This is the method recommended when the client application desires to receive all the execution profiles
  for the current kernel instance on all devices over all client threads running such kernel with a single observer<br/>
  <b>Note1: </b>A report will be generated by a thread that finishes executing a kernel. In multithreaded execution
  environments it is up to the observer implementation to handle thread safety.
  <br/>
  <b>Note2: </b>To cancel the report subscription just set observer to <code>null</code> value.
  <br/>
  @param observer the observer instance that will receive the profile reports