[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