[PATCH] Extend prifiling tool to support Vsize and Rss memory usage profile per call

Shuang He shuang.he at intel.com
Thu Feb 28 00:45:05 PST 2013


On 2013/2/28 15:52, José Fonseca wrote:
> Hi Shuang,
>
> Sorry for the delay. I've read through your change and it looks good.
> I just need to test the build on all OSes and then commit.

Thank you. that's the most important thing I'm worrying about. Hope it 
would work :)

>
> BTW, a potential follow improvement upon this would be to use
> GL_NVX_gpu_memory_info / GL_ATI_meminfo to track GPU memory.

Nice to know that there's vendor specific extension to use, while would 
be faster than using proc

Thanks
     --Shuang
>
> Of course, there's no 1:1 relationship between calls and memory --
> things are much more complex --, but still,
> I think that these would be useful for embedded app developers (or
> driver maintainers) that are conscious about memory usage to
> understand where system/gpu memory is going into.
>
> Jose
>
> On Thu, Feb 28, 2013 at 12:45 AM, Shuang He <shuang.he at intel.com> wrote:
>> So, any more thoughts on this?
>>
>> Thanks
>>      --Shuang
>>
>>
>> On 2013/2/18 10:09, Shuang He wrote:
>>> Add one new option -pmem for retrace tool to track Visze and Rss usage
>>> during every call
>>>
>>> Signed-off-by: Shuang He <shuang.he at intel.com>
>>> ---
>>>    CMakeLists.txt             |    4 +++
>>>    common/os_memory.hpp       |   67
>>> ++++++++++++++++++++++++++++++++++++++++++
>>>    common/trace_profiler.cpp  |   70
>>> +++++++++++++++++++++++++++++++++++++++++---
>>>    common/trace_profiler.hpp  |   26 ++++++++++++++--
>>>    retrace/CMakeLists.txt     |    6 ++++
>>>    retrace/glretrace_main.cpp |   46 +++++++++++++++++++++++++++--
>>>    retrace/retrace.hpp        |    3 ++
>>>    retrace/retrace_main.cpp   |   15 +++++++++-
>>>    8 files changed, 228 insertions(+), 9 deletions(-)
>>>    create mode 100644 common/os_memory.hpp
>>>
>>> diff --git a/CMakeLists.txt b/CMakeLists.txt
>>> index 91f1b87..90bfc87 100644
>>> --- a/CMakeLists.txt
>>> +++ b/CMakeLists.txt
>>> @@ -191,6 +191,10 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
>>>            ERROR_QUIET
>>>            OUTPUT_STRIP_TRAILING_WHITESPACE
>>>        )
>>> +    CHECK_INCLUDE_FILES(proc/readproc.h READPROC_H_FOUND)
>>> +    if (READPROC_H_FOUND)
>>> +        add_definitions (-DHAVE_READPROC_H)
>>> +    endif ()
>>>    endif()
>>>      if (WIN32 OR APPLE)
>>> diff --git a/common/os_memory.hpp b/common/os_memory.hpp
>>> new file mode 100644
>>> index 0000000..e0c5630
>>> --- /dev/null
>>> +++ b/common/os_memory.hpp
>>> @@ -0,0 +1,67 @@
>>>
>>> +/**************************************************************************
>>> + *
>>> + * Copyright (C) 2013 Intel Corporation. All rights reversed.
>>> + * Author: Shuang He <shuang.he at intel.com>
>>> + * All Rights Reserved.
>>> + *
>>> + * Permission is hereby granted, free of charge, to any person obtaining
>>> a copy
>>> + * of this software and associated documentation files (the "Software"),
>>> to deal
>>> + * in the Software without restriction, including without limitation the
>>> rights
>>> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
>>> sell
>>> + * copies of the Software, and to permit persons to whom the Software is
>>> + * furnished to do so, subject to the following conditions:
>>> + *
>>> + * The above copyright notice and this permission notice shall be
>>> included in
>>> + * all copies or substantial portions of the Software.
>>> + *
>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>>> EXPRESS OR
>>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>> MERCHANTABILITY,
>>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
>>> SHALL THE
>>> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>>> ARISING FROM,
>>> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>>> IN
>>> + * THE SOFTWARE.
>>> + *
>>> +
>>> **************************************************************************/
>>> +
>>> +/*
>>> + * Simple OS time measurement abstraction.
>>> + */
>>> +
>>> +#ifndef _OS_MEMORY_HPP_
>>> +#define _OS_MEMORY_HPP_
>>> +
>>> +#ifdef HAVE_READPROC_H
>>> +#include <proc/readproc.h>
>>> +
>>> +namespace os {
>>> +    inline long long
>>> +    getVsize(void) {
>>> +        proc_t proc;
>>> +       look_up_our_self(&proc);
>>> +        return proc.vsize;
>>> +    }
>>> +
>>> +    inline long long
>>> +    getRss(void) {
>>> +        proc_t proc;
>>> +       look_up_our_self(&proc);
>>> +        return proc.rss;
>>> +    }
>>> +} /* namespace os */
>>> +
>>> +#else
>>> +namespace os {
>>> +    inline long long
>>> +    getVsize(void) {
>>> +        return 0;
>>> +    }
>>> +
>>> +    inline long long
>>> +    getRss(void) {
>>> +        return 0;
>>> +    }
>>> +} /* namespace os */
>>> +#endif
>>> +
>>> +#endif /* _OS_MEMORY_HPP_ */
>>> diff --git a/common/trace_profiler.cpp b/common/trace_profiler.cpp
>>> index 0f90ee2..d4d4260 100644
>>> --- a/common/trace_profiler.cpp
>>> +++ b/common/trace_profiler.cpp
>>> @@ -1,6 +1,7 @@
>>>
>>> /**************************************************************************
>>>     *
>>>     * Copyright 2012 VMware, Inc.
>>> + * Copyright 2013 Intel, Inc.
>>>     * All Rights Reserved.
>>>     *
>>>     * Permission is hereby granted, free of charge, to any person obtaining
>>> a copy
>>> @@ -34,9 +35,12 @@ Profiler::Profiler()
>>>        : baseGpuTime(0),
>>>          baseCpuTime(0),
>>>          minCpuTime(1000),
>>> +      baseVsizeUsage(0),
>>> +      baseRssUsage(0),
>>>          cpuTimes(false),
>>>          gpuTimes(true),
>>> -      pixelsDrawn(false)
>>> +      pixelsDrawn(false),
>>> +      memoryUsage(false)
>>>    {
>>>    }
>>>    @@ -44,13 +48,14 @@ Profiler::~Profiler()
>>>    {
>>>    }
>>>    -void Profiler::setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_)
>>> +void Profiler::setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_,
>>> bool memoryUsage_)
>>>    {
>>>        cpuTimes = cpuTimes_;
>>>        gpuTimes = gpuTimes_;
>>>        pixelsDrawn = pixelsDrawn_;
>>> +    memoryUsage = memoryUsage_;
>>>    -    std::cout << "# call no gpu_start gpu_dura cpu_start cpu_dura
>>> pixels program name" << std::endl;
>>> +    std::cout << "# call no gpu_start gpu_dura cpu_start cpu_dura
>>> vsize_start vsize_dura rss_start rss_dura pixels program name" << std::endl;
>>>    }
>>>      int64_t Profiler::getBaseCpuTime()
>>> @@ -63,6 +68,16 @@ int64_t Profiler::getBaseGpuTime()
>>>        return baseGpuTime;
>>>    }
>>>    +int64_t Profiler::getBaseVsizeUsage()
>>> +{
>>> +    return baseVsizeUsage;
>>> +}
>>> +
>>> +int64_t Profiler::getBaseRssUsage()
>>> +{
>>> +    return baseRssUsage;
>>> +}
>>> +
>>>    void Profiler::setBaseCpuTime(int64_t cpuStart)
>>>    {
>>>        baseCpuTime = cpuStart;
>>> @@ -73,6 +88,16 @@ void Profiler::setBaseGpuTime(int64_t gpuStart)
>>>        baseGpuTime = gpuStart;
>>>    }
>>>    +void Profiler::setBaseVsizeUsage(int64_t vsizeStart)
>>> +{
>>> +    baseVsizeUsage = vsizeStart;
>>> +}
>>> +
>>> +void Profiler::setBaseRssUsage(int64_t rssStart)
>>> +{
>>> +    baseRssUsage = rssStart;
>>> +}
>>> +
>>>    bool Profiler::hasBaseTimes()
>>>    {
>>>        return baseCpuTime != 0 || baseGpuTime != 0;
>>> @@ -83,7 +108,9 @@ void Profiler::addCall(unsigned no,
>>>                           unsigned program,
>>>                           int64_t pixels,
>>>                           int64_t gpuStart, int64_t gpuDuration,
>>> -                       int64_t cpuStart, int64_t cpuDuration)
>>> +                       int64_t cpuStart, int64_t cpuDuration,
>>> +                      int64_t vsizeStart, int64_t vsizeDuration,
>>> +                      int64_t rssStart, int64_t rssDuration)
>>>    {
>>>        if (gpuTimes && gpuStart) {
>>>            gpuStart -= baseGpuTime;
>>> @@ -109,12 +136,23 @@ void Profiler::addCall(unsigned no,
>>>            pixels = 0;
>>>        }
>>>    +    if (!memoryUsage || !vsizeStart || !rssStart) {
>>> +        vsizeStart = 0;
>>> +       vsizeDuration = 0;
>>> +       rssStart = 0;
>>> +       rssDuration = 0;
>>> +    }
>>> +
>>>        std::cout << "call"
>>>                  << " " << no
>>>                  << " " << gpuStart
>>>                  << " " << gpuDuration
>>>                  << " " << cpuStart
>>>                  << " " << cpuDuration
>>> +             << " " << vsizeStart
>>> +             << " " << vsizeDuration
>>> +             << " " << rssStart
>>> +             << " " << rssDuration
>>>                  << " " << pixels
>>>                  << " " << program
>>>                  << " " << name
>>> @@ -132,6 +170,8 @@ void Profiler::parseLine(const char* in, Profile*
>>> profile)
>>>        std::string type;
>>>        static int64_t lastGpuTime;
>>>        static int64_t lastCpuTime;
>>> +    static int64_t lastVsizeUsage;
>>> +    static int64_t lastRssUsage;
>>>          if (in[0] == '#' || strlen(in) < 4)
>>>            return;
>>> @@ -139,6 +179,8 @@ void Profiler::parseLine(const char* in, Profile*
>>> profile)
>>>        if (profile->programs.size() == 0 && profile->calls.size() == 0 &&
>>> profile->frames.size() == 0) {
>>>            lastGpuTime = 0;
>>>            lastCpuTime = 0;
>>> +       lastVsizeUsage = 0;
>>> +       lastRssUsage = 0;
>>>        }
>>>          line >> type;
>>> @@ -151,6 +193,10 @@ void Profiler::parseLine(const char* in, Profile*
>>> profile)
>>>                 >> call.gpuDuration
>>>                 >> call.cpuStart
>>>                 >> call.cpuDuration
>>> +            >> call.vsizeStart
>>> +            >> call.vsizeDuration
>>> +            >> call.rssStart
>>> +            >> call.rssDuration
>>>                 >> call.pixels
>>>                 >> call.program
>>>                 >> call.name;
>>> @@ -163,6 +209,14 @@ void Profiler::parseLine(const char* in, Profile*
>>> profile)
>>>                lastCpuTime = call.cpuStart + call.cpuDuration;
>>>            }
>>>    +     if (lastVsizeUsage < call.vsizeStart + call.vsizeDuration) {
>>> +            lastVsizeUsage = call.vsizeStart + call.vsizeDuration;
>>> +       }
>>> +
>>> +       if (lastRssUsage < call.rssStart + call.rssDuration) {
>>> +            lastRssUsage = call.rssStart + call.rssDuration;
>>> +       }
>>> +
>>>            profile->calls.push_back(call);
>>>              if (call.pixels >= 0) {
>>> @@ -174,6 +228,8 @@ void Profiler::parseLine(const char* in, Profile*
>>> profile)
>>>                program.cpuTotal += call.cpuDuration;
>>>                program.gpuTotal += call.gpuDuration;
>>>                program.pixelTotal += call.pixels;
>>> +           program.vsizeTotal += call.vsizeDuration;
>>> +           program.rssTotal += call.rssDuration;
>>>                program.calls.push_back(profile->calls.size() - 1);
>>>            }
>>>        } else if (type.compare("frame_end") == 0) {
>>> @@ -183,15 +239,21 @@ void Profiler::parseLine(const char* in, Profile*
>>> profile)
>>>            if (frame.no == 0) {
>>>                frame.gpuStart = 0;
>>>                frame.cpuStart = 0;
>>> +           frame.vsizeStart = 0;
>>> +           frame.rssStart = 0;
>>>                frame.calls.begin = 0;
>>>            } else {
>>>                frame.gpuStart = profile->frames.back().gpuStart +
>>> profile->frames.back().gpuDuration;
>>>                frame.cpuStart = profile->frames.back().cpuStart +
>>> profile->frames.back().cpuDuration;
>>> +           frame.vsizeStart = profile->frames.back().vsizeStart +
>>> profile->frames.back().vsizeDuration;
>>> +           frame.rssStart = profile->frames.back().rssStart +
>>> profile->frames.back().rssDuration;
>>>                frame.calls.begin = profile->frames.back().calls.end + 1;
>>>            }
>>>              frame.gpuDuration = lastGpuTime - frame.gpuStart;
>>>            frame.cpuDuration = lastCpuTime - frame.cpuStart;
>>> +       frame.vsizeDuration = lastVsizeUsage - frame.vsizeStart;
>>> +       frame.rssDuration = lastRssUsage - frame.rssStart;
>>>            frame.calls.end = profile->calls.size() - 1;
>>>              profile->frames.push_back(frame);
>>> diff --git a/common/trace_profiler.hpp b/common/trace_profiler.hpp
>>> index d833242..b0b3bd5 100644
>>> --- a/common/trace_profiler.hpp
>>> +++ b/common/trace_profiler.hpp
>>> @@ -1,6 +1,7 @@
>>>
>>> /**************************************************************************
>>>     *
>>>     * Copyright 2012 VMware, Inc.
>>> + * Copyright 2013 Intel, Inc.
>>>     * All Rights Reserved.
>>>     *
>>>     * Permission is hereby granted, free of charge, to any person obtaining
>>> a copy
>>> @@ -45,6 +46,11 @@ struct Profile {
>>>            int64_t cpuStart;
>>>            int64_t cpuDuration;
>>>    +     int64_t vsizeStart;
>>> +       int64_t vsizeDuration;
>>> +       int64_t rssStart;
>>> +       int64_t rssDuration;
>>> +
>>>            int64_t pixels;
>>>              std::string name;
>>> @@ -59,6 +65,11 @@ struct Profile {
>>>            int64_t cpuStart;
>>>            int64_t cpuDuration;
>>>    +     int64_t vsizeStart;
>>> +       int64_t vsizeDuration;
>>> +       int64_t rssStart;
>>> +       int64_t rssDuration;
>>> +
>>>            /* Indices to profile->calls array */
>>>            struct {
>>>                unsigned begin;
>>> @@ -72,6 +83,8 @@ struct Profile {
>>>            uint64_t gpuTotal;
>>>            uint64_t cpuTotal;
>>>            uint64_t pixelTotal;
>>> +       int64_t vsizeTotal;
>>> +       int64_t rssTotal;
>>>              /* Indices to profile->calls array */
>>>            std::vector<unsigned> calls;
>>> @@ -88,14 +101,16 @@ public:
>>>        Profiler();
>>>        ~Profiler();
>>>    -    void setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_);
>>> +    void setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_, bool
>>> memoryUsage_);
>>>          void addCall(unsigned no,
>>>                     const char* name,
>>>                     unsigned program,
>>>                     int64_t pixels,
>>>                     int64_t gpuStart, int64_t gpuDuration,
>>> -                 int64_t cpuStart, int64_t cpuDuration);
>>> +                 int64_t cpuStart, int64_t cpuDuration,
>>> +                int64_t vsizeStart, int64_t vsizeDuration,
>>> +                int64_t rssStart, int64_t rssDuration);
>>>          void addFrameEnd();
>>>    @@ -103,9 +118,13 @@ public:
>>>          void setBaseCpuTime(int64_t cpuStart);
>>>        void setBaseGpuTime(int64_t gpuStart);
>>> +    void setBaseVsizeUsage(int64_t vsizeStart);
>>> +    void setBaseRssUsage(int64_t rssStart);
>>>          int64_t getBaseCpuTime();
>>>        int64_t getBaseGpuTime();
>>> +    int64_t getBaseVsizeUsage();
>>> +    int64_t getBaseRssUsage();
>>>          static void parseLine(const char* line, Profile* profile);
>>>    @@ -113,10 +132,13 @@ private:
>>>        int64_t baseGpuTime;
>>>        int64_t baseCpuTime;
>>>        int64_t minCpuTime;
>>> +    int64_t baseVsizeUsage;
>>> +    int64_t baseRssUsage;
>>>          bool cpuTimes;
>>>        bool gpuTimes;
>>>        bool pixelsDrawn;
>>> +    bool memoryUsage;
>>>    };
>>>    }
>>>    diff --git a/retrace/CMakeLists.txt b/retrace/CMakeLists.txt
>>> index b271727..9ea1ae9 100644
>>> --- a/retrace/CMakeLists.txt
>>> +++ b/retrace/CMakeLists.txt
>>> @@ -102,6 +102,9 @@ if (WIN32 OR APPLE OR X11_FOUND)
>>>              if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
>>>                target_link_libraries (glretrace rt)
>>> +            if (READPROC_H_FOUND)
>>> +                target_link_libraries (glretrace proc)
>>> +            endif ()
>>>            endif ()
>>>          endif ()
>>> @@ -127,6 +130,9 @@ if (ENABLE_EGL AND X11_FOUND AND NOT WIN32 AND NOT
>>> APPLE)
>>>          if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
>>>            target_link_libraries (eglretrace rt)
>>> +        if (READPROC_H_FOUND)
>>> +            target_link_libraries (eglretrace proc)
>>> +        endif ()
>>>        endif ()
>>>          install (TARGETS eglretrace RUNTIME DESTINATION bin)
>>> diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp
>>> index d0298fc..7d0b7c9 100755
>>> --- a/retrace/glretrace_main.cpp
>>> +++ b/retrace/glretrace_main.cpp
>>> @@ -1,6 +1,8 @@
>>>
>>> /**************************************************************************
>>>     *
>>>     * Copyright 2011 Jose Fonseca
>>> + * Copyright (C) 2013 Intel Corporation. All rights reversed.
>>> + * Author: Shuang He <shuang.he at intel.com>
>>>     * All Rights Reserved.
>>>     *
>>>     * Permission is hereby granted, free of charge, to any person obtaining
>>> a copy
>>> @@ -31,6 +33,7 @@
>>>    #include "glstate.hpp"
>>>    #include "glretrace.hpp"
>>>    #include "os_time.hpp"
>>> +#include "os_memory.hpp"
>>>      /* Synchronous debug output may reduce performance however,
>>>     * without it the callNo in the callback may be inaccurate
>>> @@ -59,6 +62,10 @@ struct CallQuery
>>>        const trace::FunctionSig *sig;
>>>        int64_t cpuStart;
>>>        int64_t cpuEnd;
>>> +    int64_t vsizeStart;
>>> +    int64_t vsizeEnd;
>>> +    int64_t rssStart;
>>> +    int64_t rssEnd;
>>>    };
>>>      static bool supportsElapsed = true;
>>> @@ -137,10 +144,20 @@ getTimeFrequency(void) {
>>>        }
>>>    }
>>>    +static inline void
>>> +getCurrentVsize(int64_t& vsize) {
>>> +    vsize = os::getVsize();
>>> +}
>>> +
>>> +static inline void
>>> +getCurrentRss(int64_t& rss) {
>>> +    rss = os::getRss();
>>> +}
>>> +
>>>    static void
>>>    completeCallQuery(CallQuery& query) {
>>>        /* Get call start and duration */
>>> -    int64_t gpuStart = 0, gpuDuration = 0, cpuDuration = 0, pixels = 0;
>>> +    int64_t gpuStart = 0, gpuDuration = 0, cpuDuration = 0, pixels = 0,
>>> vsizeDuration = 0, rssDuration = 0;
>>>          if (query.isDraw) {
>>>            if (retrace::profilingGpuTimes) {
>>> @@ -163,10 +180,15 @@ completeCallQuery(CallQuery& query) {
>>>            cpuDuration = query.cpuEnd - query.cpuStart;
>>>        }
>>>    +    if (retrace::profilingMemoryUsage) {
>>> +        vsizeDuration = query.vsizeEnd - query.vsizeStart;
>>> +        rssDuration = query.rssEnd - query.rssStart;
>>> +    }
>>> +
>>>        glDeleteQueries(NUM_QUERIES, query.ids);
>>>          /* Add call to profile */
>>> -    retrace::profiler.addCall(query.call, query.sig->name, query.program,
>>> pixels, gpuStart, gpuDuration, query.cpuStart, cpuDuration);
>>> +    retrace::profiler.addCall(query.call, query.sig->name, query.program,
>>> pixels, gpuStart, gpuDuration, query.cpuStart, cpuDuration,
>>> query.vsizeStart, vsizeDuration, query.rssStart, rssDuration);
>>>    }
>>>      void
>>> @@ -213,6 +235,12 @@ beginProfile(trace::Call &call, bool isDraw) {
>>>            CallQuery& query = callQueries.back();
>>>            query.cpuStart = getCurrentTime();
>>>        }
>>> +
>>> +    if (retrace::profilingMemoryUsage) {
>>> +       CallQuery& query = callQueries.back();
>>> +        query.vsizeStart = os::getVsize();
>>> +        query.rssStart = os::getRss();
>>> +    }
>>>    }
>>>      void
>>> @@ -234,6 +262,12 @@ endProfile(trace::Call &call, bool isDraw) {
>>>                glEndQuery(GL_SAMPLES_PASSED);
>>>            }
>>>        }
>>> +
>>> +    if (retrace::profilingMemoryUsage) {
>>> +        CallQuery& query = callQueries.back();
>>> +       query.vsizeEnd = os::getVsize();
>>> +       query.rssEnd = os::getRss();
>>> +    }
>>>    }
>>>      void
>>> @@ -287,6 +321,14 @@ initContext() {
>>>                retrace::profiler.setBaseGpuTime(currentTime);
>>>            }
>>>        }
>>> +
>>> +    if (retrace::profilingMemoryUsage) {
>>> +        GLint64 currentVsize, currentRss;
>>> +       getCurrentVsize(currentVsize);
>>> +       retrace::profiler.setBaseVsizeUsage(currentVsize);
>>> +       getCurrentRss(currentRss);
>>> +       retrace::profiler.setBaseRssUsage(currentRss);
>>> +    }
>>>    }
>>>      void
>>> diff --git a/retrace/retrace.hpp b/retrace/retrace.hpp
>>> index 7c8dcd5..14317cf 100644
>>> --- a/retrace/retrace.hpp
>>> +++ b/retrace/retrace.hpp
>>> @@ -1,6 +1,8 @@
>>>
>>> /**************************************************************************
>>>     *
>>>     * Copyright 2011-2012 Jose Fonseca
>>> + * Copyright (C) 2013 Intel Corporation. All rights reversed.
>>> + * Author: Shuang He <shuang.he at intel.com>
>>>     * All Rights Reserved.
>>>     *
>>>     * Permission is hereby granted, free of charge, to any person obtaining
>>> a copy
>>> @@ -92,6 +94,7 @@ extern bool profiling;
>>>    extern bool profilingCpuTimes;
>>>    extern bool profilingGpuTimes;
>>>    extern bool profilingPixelsDrawn;
>>> +extern bool profilingMemoryUsage;
>>>      /**
>>>     * State dumping.
>>> diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp
>>> index ca03745..257b253 100644
>>> --- a/retrace/retrace_main.cpp
>>> +++ b/retrace/retrace_main.cpp
>>> @@ -1,6 +1,8 @@
>>>
>>> /**************************************************************************
>>>     *
>>>     * Copyright 2011 Jose Fonseca
>>> + * Copyright (C) 2013 Intel Corporation. All rights reversed.
>>> + * Author: Shuang He <shuang.he at intel.com>
>>>     * All Rights Reserved.
>>>     *
>>>     * Permission is hereby granted, free of charge, to any person obtaining
>>> a copy
>>> @@ -72,6 +74,7 @@ bool profiling = false;
>>>    bool profilingGpuTimes = false;
>>>    bool profilingCpuTimes = false;
>>>    bool profilingPixelsDrawn = false;
>>> +bool profilingMemoryUsage = false;
>>>    bool useCallNos = true;
>>>      unsigned frameNo = 0;
>>> @@ -514,6 +517,7 @@ usage(const char *argv0) {
>>>            "      --pcpu              cpu profiling (cpu times per call)\n"
>>>            "      --pgpu              gpu profiling (gpu times per draw
>>> call)\n"
>>>            "      --ppd               pixels drawn profiling (pixels drawn
>>> per draw call)\n"
>>> +       "      --pmem              memory usage profiling (vsize rss per
>>> call)\n"
>>>            "  -c, --compare=PREFIX    compare against snapshots with given
>>> PREFIX\n"
>>>            "  -C, --calls=CALLSET     calls to compare (default is every
>>> frame)\n"
>>>            "      --call-nos[=BOOL]   use call numbers in snapshot
>>> filenames\n"
>>> @@ -536,6 +540,7 @@ enum {
>>>        PCPU_OPT,
>>>        PGPU_OPT,
>>>        PPD_OPT,
>>> +    PMEM_OPT,
>>>        SB_OPT,
>>>    };
>>>    @@ -556,6 +561,7 @@ longOptions[] = {
>>>        {"pcpu", no_argument, 0, PCPU_OPT},
>>>        {"pgpu", no_argument, 0, PGPU_OPT},
>>>        {"ppd", no_argument, 0, PPD_OPT},
>>> +    {"pmem", no_argument, 0, PMEM_OPT},
>>>        {"sb", no_argument, 0, SB_OPT},
>>>        {"snapshot-prefix", required_argument, 0, 's'},
>>>        {"snapshot", required_argument, 0, 'S'},
>>> @@ -676,6 +682,13 @@ int main(int argc, char **argv)
>>>                  retrace::profilingPixelsDrawn = true;
>>>                break;
>>> +        case PMEM_OPT:
>>> +            retrace::debug = false;
>>> +           retrace::profiling = true;
>>> +           retrace::verbosity = -1;
>>> +
>>> +           retrace::profilingMemoryUsage = true;
>>> +           break;
>>>            default:
>>>                std::cerr << "error: unknown option " << opt << "\n";
>>>                usage(argv[0]);
>>> @@ -685,7 +698,7 @@ int main(int argc, char **argv)
>>>          retrace::setUp();
>>>        if (retrace::profiling) {
>>> -        retrace::profiler.setup(retrace::profilingCpuTimes,
>>> retrace::profilingGpuTimes, retrace::profilingPixelsDrawn);
>>> +        retrace::profiler.setup(retrace::profilingCpuTimes,
>>> retrace::profilingGpuTimes, retrace::profilingPixelsDrawn,
>>> retrace::profilingMemoryUsage);
>>>        }
>>>          os::setExceptionCallback(exceptionCallback);
>>
>> _______________________________________________
>> apitrace mailing list
>> apitrace at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/apitrace



More information about the apitrace mailing list