[Mesa-dev] [PATCH 2/2] gallivm: print out how long it takes to optimize shader IR.
Jose Fonseca
jfonseca at vmware.com
Fri May 16 10:07:12 PDT 2014
Series looks good to me.
Jose
----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
>
> Enabled with GALLIVM_DEBUG=perf (which up to now was only used to print
> warnings for unoptimized code).
>
> While some unexpectedly long shader compile times for some shaders were fixed
> with 8a9f5ecdb116d0449d63f7b94efbfa8b205d826f this should help recognize such
> problems in the future. For now though only available in debug builds (which
> are not always suitable for such analysis). And since this uses system time,
> it might not be all that accurate (even llvmpipe's own rasterization threads
> might be running at the same time, or just other tasks).
> (llvmpipe also has LP_DEBUG=counters but this only gives an average per
> shader
> and the the total time for all shaders.)
> This prints information like this:
> optimizing module fs17_variant0 took 1 msec
> optimizing module setup_variant_0 took 0 msec
> optimizing module draw_llvm_vs_variant0 took 9 msec
> optimizing module draw_llvm_vs_variant0 took 12 msec
> optimizing module fs17_variant1 took 2 msec
>
> v2: rebase for recent gallivm compilation changes, and print time for whole
> modules instead of functions (otherwise it would be very spammy since it
> would
> include all trivial inline sse2 functions), using the shiny new module names,
> prying them off LLVM using new helper (not available through C bindings).
> Per function timings, while possibly giving more information (if there'd be
> a problem only in for instance the partial not the whole function), don't
> seem
> all that useful for now.
> ---
> src/gallium/auxiliary/gallivm/lp_bld_debug.cpp | 9 +++++++++
> src/gallium/auxiliary/gallivm/lp_bld_debug.h | 4 ++++
> src/gallium/auxiliary/gallivm/lp_bld_init.c | 19 ++++++++++++++++++-
> 3 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp
> b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp
> index 5d6d45d..621290f 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp
> @@ -39,6 +39,8 @@
>
> #include <llvm/Support/Host.h>
>
> +#include <llvm/IR/Module.h>
> +
> #include <llvm/MC/MCDisassembler.h>
> #include <llvm/MC/MCAsmInfo.h>
> #include <llvm/MC/MCInst.h>
> @@ -111,6 +113,13 @@ raw_debug_ostream::write_impl(const char *Ptr, size_t
> Size)
> }
>
>
> +extern "C" const char *
> +lp_get_module_id(LLVMModuleRef module)
> +{
> + return llvm::unwrap(module)->getModuleIdentifier().c_str();
> +}
> +
> +
> /**
> * Same as LLVMDumpValue, but through our debugging channels.
> */
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> b/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> index 76c39af..321e09d 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.h
> @@ -76,6 +76,10 @@ lp_build_name(LLVMValueRef val, const char *format, ...)
> }
>
>
> +const char *
> +lp_get_module_id(LLVMModuleRef module);
> +
> +
> void
> lp_debug_dump_value(LLVMValueRef value);
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c
> b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> index 7aebebb..8b8686d 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> @@ -32,6 +32,7 @@
> #include "util/u_debug.h"
> #include "util/u_memory.h"
> #include "util/u_simple_list.h"
> +#include "os/os_time.h"
> #include "lp_bld.h"
> #include "lp_bld_debug.h"
> #include "lp_bld_misc.h"
> @@ -498,6 +499,7 @@ gallivm_destroy(struct gallivm_state *gallivm)
>
> /**
> * Validate a function.
> + * Verification is only done with debug builds.
> */
> void
> gallivm_verify_function(struct gallivm_state *gallivm,
> @@ -520,10 +522,15 @@ gallivm_verify_function(struct gallivm_state *gallivm,
> }
>
>
> +/**
> + * Compile a module.
> + * This does IR optimization on all functions in the module.
> + */
> void
> gallivm_compile_module(struct gallivm_state *gallivm)
> {
> LLVMValueRef func;
> + int64_t time_begin;
>
> assert(!gallivm->compiled);
>
> @@ -532,18 +539,28 @@ gallivm_compile_module(struct gallivm_state *gallivm)
> gallivm->builder = NULL;
> }
>
> + if (gallivm_debug & GALLIVM_DEBUG_PERF)
> + time_begin = os_time_get();
> +
> /* Run optimization passes */
> LLVMInitializeFunctionPassManager(gallivm->passmgr);
> func = LLVMGetFirstFunction(gallivm->module);
> while (func) {
> if (0) {
> - debug_printf("optimizing %s...\n", LLVMGetValueName(func));
> + debug_printf("optimizing func %s...\n", LLVMGetValueName(func));
> }
> LLVMRunFunctionPassManager(gallivm->passmgr, func);
> func = LLVMGetNextFunction(func);
> }
> LLVMFinalizeFunctionPassManager(gallivm->passmgr);
>
> + if (gallivm_debug & GALLIVM_DEBUG_PERF) {
> + int64_t time_end = os_time_get();
> + int time_msec = (int)(time_end - time_begin) / 1000;
> + debug_printf("optimizing module %s took %d msec\n",
> + lp_get_module_id(gallivm->module), time_msec);
> + }
> +
> /* Dump byte code to a file */
> if (0) {
> LLVMWriteBitcodeToFile(gallivm->module, "llvmpipe.bc");
> --
> 1.9.1
>
More information about the mesa-dev
mailing list