[Mesa-dev] [PATCH 7/7] swr/rast: Store cached files in multiple subdirs

Cherniak, Bruce bruce.cherniak at intel.com
Tue Jan 15 20:40:09 UTC 2019


Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com> 

> On Dec 17, 2018, at 8:36 AM, Alok Hota <alok.hota at intel.com> wrote:
> 
> This improves cache filesystem performance, especially during CI tests
> Also updated jitcache magic number due to codegen parameter changes
> Removed 2 `if constexpr` to prevent C++17 requirement
> ---
> .../swr/rasterizer/jitter/JitManager.cpp      | 51 ++++++++++++++++---
> .../swr/rasterizer/jitter/JitManager.h        |  6 +++
> .../swr/rasterizer/jitter/builder_misc.cpp    | 33 +-----------
> 3 files changed, 52 insertions(+), 38 deletions(-)
> 
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> index 1b2b570318c..a549721f147 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> @@ -582,7 +582,7 @@ struct JitCacheFileHeader
>     uint64_t GetObjectCRC() const { return m_objCRC; }
> 
> private:
> -    static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543211ULL + 4;
> +    static const uint64_t JC_MAGIC_NUMBER = 0xfedcba9876543210ULL + 6;
>     static const size_t   JC_STR_MAX_LEN  = 32;
>     static const uint32_t JC_PLATFORM_KEY = (LLVM_VERSION_MAJOR << 24) |
>                                             (LLVM_VERSION_MINOR << 16) | (LLVM_VERSION_PATCH << 8) |
> @@ -634,6 +634,15 @@ JitCache::JitCache()
>     {
>         mCacheDir = KNOB_JIT_CACHE_DIR;
>     }
> +
> +    // Create cache dir at startup to allow jitter to write debug.ll files
> +    // to that directory.
> +    if (!llvm::sys::fs::exists(mCacheDir.str()) &&
> +        llvm::sys::fs::create_directories(mCacheDir.str()))
> +    {
> +        SWR_INVALID("Unable to create directory: %s", mCacheDir.c_str());
> +    }
> +
> }
> 
> int ExecUnhookedProcess(const std::string& CmdLine, std::string* pStdOut, std::string* pStdErr)
> @@ -641,6 +650,26 @@ int ExecUnhookedProcess(const std::string& CmdLine, std::string* pStdOut, std::s
>     return ExecCmd(CmdLine, "", pStdOut, pStdErr);
> }
> 
> +/// Calculate actual directory where module will be cached.
> +/// This is always a subdirectory of mCacheDir.  Full absolute
> +/// path name will be stored in mCurrentModuleCacheDir
> +void JitCache::CalcModuleCacheDir()
> +{
> +    mModuleCacheDir.clear();
> +
> +    llvm::SmallString<MAX_PATH> moduleDir = mCacheDir;
> +
> +    // Create 4 levels of directory hierarchy based on CRC, 256 entries each
> +    uint8_t* pCRC = (uint8_t*)&mCurrentModuleCRC;
> +    for (uint32_t i = 0; i < 4; ++i)
> +    {
> +        llvm::sys::path::append(moduleDir, std::to_string((int)pCRC[i]));
> +    }
> +
> +    mModuleCacheDir = moduleDir;
> +}
> +
> +
> /// notifyObjectCompiled - Provides a pointer to compiled code for Module M.
> void JitCache::notifyObjectCompiled(const llvm::Module* M, llvm::MemoryBufferRef Obj)
> {
> @@ -650,16 +679,22 @@ void JitCache::notifyObjectCompiled(const llvm::Module* M, llvm::MemoryBufferRef
>         return;
>     }
> 
> -    if (!llvm::sys::fs::exists(mCacheDir.str()) &&
> -        llvm::sys::fs::create_directories(mCacheDir.str()))
> +    if (!mModuleCacheDir.size())
>     {
> -        SWR_INVALID("Unable to create directory: %s", mCacheDir.c_str());
> +        SWR_INVALID("Unset module cache directory");
> +        return;
> +    }
> +
> +    if (!llvm::sys::fs::exists(mModuleCacheDir.str()) &&
> +        llvm::sys::fs::create_directories(mModuleCacheDir.str()))
> +    {
> +        SWR_INVALID("Unable to create directory: %s", mModuleCacheDir.c_str());
>         return;
>     }
> 
>     JitCacheFileHeader header;
> 
> -    llvm::SmallString<MAX_PATH> filePath = mCacheDir;
> +    llvm::SmallString<MAX_PATH> filePath = mModuleCacheDir;
>     llvm::sys::path::append(filePath, moduleID);
> 
>     llvm::SmallString<MAX_PATH> objPath = filePath;
> @@ -699,12 +734,14 @@ std::unique_ptr<llvm::MemoryBuffer> JitCache::getObject(const llvm::Module* M)
>         return nullptr;
>     }
> 
> -    if (!llvm::sys::fs::exists(mCacheDir))
> +    CalcModuleCacheDir();
> +
> +    if (!llvm::sys::fs::exists(mModuleCacheDir))
>     {
>         return nullptr;
>     }
> 
> -    llvm::SmallString<MAX_PATH> filePath = mCacheDir;
> +    llvm::SmallString<MAX_PATH> filePath = mModuleCacheDir;
>     llvm::sys::path::append(filePath, moduleID);
> 
>     llvm::SmallString<MAX_PATH> objFilePath = filePath;
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> index 5659191525d..bb7ca8b4a3e 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> @@ -113,9 +113,15 @@ public:
> private:
>     std::string                 mCpu;
>     llvm::SmallString<MAX_PATH> mCacheDir;
> +    llvm::SmallString<MAX_PATH> mModuleCacheDir;
>     uint32_t                    mCurrentModuleCRC = 0;
>     JitManager*                 mpJitMgr          = nullptr;
>     llvm::CodeGenOpt::Level     mOptLevel         = llvm::CodeGenOpt::None;
> +
> +    /// Calculate actual directory where module will be cached.
> +    /// This is always a subdirectory of mCacheDir.  Full absolute
> +    /// path name will be stored in mCurrentModuleCacheDir
> +    void CalcModuleCacheDir();
> };
> 
> //////////////////////////////////////////////////////////////////////////
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp
> index 65eec4e4c68..24b733a28ae 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp
> @@ -774,13 +774,6 @@ namespace SwrJit
>     {
>         SWR_ASSERT((numIntBits + numFracBits) <= 32, "Can only handle 32-bit fixed-point values");
>         Value* fixed = nullptr;
> -        if constexpr (false) // This doesn't work for negative numbers!!
> -        {
> -            fixed = FP_TO_SI(VROUND(FMUL(vFloat, VIMMED1(float(1 << numFracBits))),
> -                                    C(_MM_FROUND_TO_NEAREST_INT)),
> -                             mSimdInt32Ty);
> -        }
> -        else
>         {
>             // Do round to nearest int on fractional bits first
>             // Not entirely perfect for negative numbers, but close enough
> @@ -844,35 +837,13 @@ namespace SwrJit
>     {
>         SWR_ASSERT((numIntBits + numFracBits) <= 32, "Can only handle 32-bit fixed-point values");
>         Value* fixed = nullptr;
> -        if constexpr (true) // KNOB_SIM_FAST_MATH?  Below works correctly from a precision
> -                            // standpoint...
> +        // KNOB_SIM_FAST_MATH?  Below works correctly from a precision
> +        // standpoint...
>         {
>             fixed = FP_TO_UI(VROUND(FMUL(vFloat, VIMMED1(float(1 << numFracBits))),
>                                     C(_MM_FROUND_TO_NEAREST_INT)),
>                              mSimdInt32Ty);
>         }
> -        else
> -        {
> -            // Do round to nearest int on fractional bits first
> -            vFloat = VROUND(FMUL(vFloat, VIMMED1(float(1 << numFracBits))),
> -                            C(_MM_FROUND_TO_NEAREST_INT));
> -            vFloat = FMUL(vFloat, VIMMED1(1.0f / float(1 << numFracBits)));
> -
> -            // TODO: Handle INF, NAN, overflow / underflow, etc.
> -
> -            Value* vSgn      = FCMP_OLT(vFloat, VIMMED1(0.0f));
> -            Value* vFloatInt = BITCAST(vFloat, mSimdInt32Ty);
> -            Value* vFixed    = AND(vFloatInt, VIMMED1((1 << 23) - 1));
> -            vFixed           = OR(vFixed, VIMMED1(1 << 23));
> -
> -            Value* vExp = LSHR(SHL(vFloatInt, VIMMED1(1)), VIMMED1(24));
> -            vExp        = SUB(vExp, VIMMED1(127));
> -
> -            Value* vExtraBits = SUB(VIMMED1(23 - numFracBits), vExp);
> -
> -            fixed = LSHR(vFixed, vExtraBits, name);
> -        }
> -
>         return fixed;
>     }
> 
> -- 
> 2.17.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list