From commits-return-23757-archive-asf-public=cust-asf.ponee.io@mxnet.incubator.apache.org Tue Feb 20 23:23:10 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 17698180654 for ; Tue, 20 Feb 2018 23:23:09 +0100 (CET) Received: (qmail 6602 invoked by uid 500); 20 Feb 2018 22:23:09 -0000 Mailing-List: contact commits-help@mxnet.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@mxnet.incubator.apache.org Delivered-To: mailing list commits@mxnet.incubator.apache.org Received: (qmail 6592 invoked by uid 99); 20 Feb 2018 22:23:09 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 20 Feb 2018 22:23:09 +0000 From: GitBox To: commits@mxnet.apache.org Subject: [GitHub] cjolivier01 commented on a change in pull request #8972: Profiling enhancements, python API, vtune and chrome tracing objects, etc. Message-ID: <151916538866.4829.15857953401254174491.gitbox@gitbox.apache.org> cjolivier01 commented on a change in pull request #8972: Profiling enhancements, python API, vtune and chrome tracing objects, etc. URL: https://github.com/apache/incubator-mxnet/pull/8972#discussion_r169480086 ########## File path: python/mxnet/profiler.py ########## @@ -52,7 +58,298 @@ def profiler_set_state(state='stop'): state2int = {'stop': 0, 'run': 1} check_call(_LIB.MXSetProfilerState(ctypes.c_int(state2int[state]))) -def dump_profile(): +def dump(finished=True): """Dump profile and stop profiler. Use this to save profile - in advance in case your program cannot exit normally.""" - check_call(_LIB.MXDumpProfile()) + in advance in case your program cannot exit normally. + + Parameters + ---------- + finished : boolean + Indicates whether to stop statistical output (dumping) after this dump. + Default is True + """ + fin = 1 if finished is True else False + check_call(_LIB.MXDumpProfile(fin)) + +def aggregate_stats_str(reset=False): + """Return a printable string of aggregate profile stats. + Parameters + ---------- + reset: boolean + Indicates whether to clean aggeregate statistical data collected up to this point + """ + debug_str = ctypes.c_char_p() + do_reset = 1 if reset is True else 0 + check_call(_LIB.MXAggregateProfileStatsPrint(ctypes.byref(debug_str), int(do_reset))) + return py_str(debug_str.value) + +def pause(): + check_call(_LIB.MXProfilePause(int(1))) + +def resume(): + check_call(_LIB.MXProfilePause(int(0))) + +class Domain(object): + """Profiling domain, used to group sub-objects like tasks, counters, etc into categories + Serves as part of 'categories' for chrome://tracing + Note: Domain handles are never destroyed. + """ + def __init__(self, name): + """Profiling Domain class constructor + Parameters + ---------- + name : string + Name of the domain + """ + self.name = name + self.handle = ProfileHandle() + check_call(_LIB.MXProfileCreateDomain(c_str(self.name), ctypes.byref(self.handle))) + + def __str__(self): + return self.name + + def new_task(self, name): + """Create new Task object owned by this domain + Parameters + ---------- + name : string + Name of the task + """ + return Task(self, name) + + def new_frame(self, name): + """Create new Frame object owned by this domain + Parameters + ---------- + name : string + Name of the frame + """ + return Frame(self, name) + + def new_counter(self, name, value=None): + """Create new Counter object owned by this domain + Parameters + ---------- + name : string + Name of the counter + """ + return Counter(self, name, value) + + def new_marker(self, name): + """Create new Marker object owned by this domain + Parameters + ---------- + name : string + Name of the marker + """ + return Marker(self, name) + +class Task(object): + """Profiling Task class + A task is a logical unit of work performed by a particular thread. + Tasks can nest; thus, tasks typically correspond to functions, scopes, or a case block + in a switch statement. + You can use the Task API to assign tasks to threads. + """ + def __init__(self, domain, name): + """Profiling Task class constructor. + Parameters + ---------- + domain : Domain object + Domain to which this object belongs + name : string + Name of the task + """ + self.name = name + self.handle = ProfileHandle() + check_call(_LIB.MXProfileCreateTask(domain.handle, + c_str(self.name), + ctypes.byref(self.handle))) + + def __del__(self): + if self.handle is not None: + check_call(_LIB.MXProfileDestroyHandle(self.handle)) + + def start(self): + """Start timing scope for this object""" + check_call(_LIB.MXProfileDurationStart(self.handle)) + + def stop(self): + """Stop timing scope for this object""" + check_call(_LIB.MXProfileDurationStop(self.handle)) + + def __str__(self): + return self.name + + +class Frame(object): + """Profiling Frame class + Use the frame API to insert calls to the desired places in your code and analyze + performance per frame, where frame is the time period between frame begin and end points. + When frames are displayed in Intel VTune Amplifier, they are displayed in a + separate track, so they provide a way to visually separate this data from normal task data. + This is different from Task in that each 'Frame' duration will be a discretely-numbered + event in the VTune output, as well as its rate (frame-rate) shown. This is analogous to + profiling each frame of some visual output, such as rendering a video game frame. + """ + def __init__(self, domain, name): + """Profiling Frame class constructor + Parameters + ---------- + domain : Domain object + Domain to which this object belongs + name : string + Name of the frame + """ + self.name = name + self.handle = ProfileHandle() + check_call(_LIB.MXProfileCreateFrame(domain.handle, + c_str(self.name), + ctypes.byref(self.handle))) + + def __del__(self): + if self.handle is not None: + check_call(_LIB.MXProfileDestroyHandle(self.handle)) + + def start(self): + """Start timing scope for this object""" + check_call(_LIB.MXProfileDurationStart(self.handle)) + + def stop(self): + """Stop timing scope for this object""" + check_call(_LIB.MXProfileDurationStop(self.handle)) + + def __str__(self): + return self.name + + +class Event(object): + """Profiling Event class Review comment: ok ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: users@infra.apache.org With regards, Apache Git Services