From 98686ab86ce062e1dbbf4ab15ef680387db35416 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Mon, 21 Jun 2010 23:44:20 +0200 Subject: fix in case we don't know how to query the L1/L2 cache sizes --- Eigen/src/Core/products/GeneralBlockPanelKernel.h | 4 ++-- Eigen/src/Core/util/Memory.h | 8 ++++++++ bench/bench_gemm.cpp | 6 ++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/Eigen/src/Core/products/GeneralBlockPanelKernel.h index 167a1ea8d..4e5ca77e7 100644 --- a/Eigen/src/Core/products/GeneralBlockPanelKernel.h +++ b/Eigen/src/Core/products/GeneralBlockPanelKernel.h @@ -35,8 +35,8 @@ inline void ei_manage_caching_sizes(Action action, std::ptrdiff_t* l1=0, std::pt m_l1CacheSize = ei_queryL1CacheSize(); m_l2CacheSize = ei_queryTopLevelCacheSize(); - if(m_l1CacheSize==0) m_l1CacheSize = 8 * 1024; - if(m_l2CacheSize==0) m_l2CacheSize = 1 * 1024 * 1024; + if(m_l1CacheSize<=0) m_l1CacheSize = 8 * 1024; + if(m_l2CacheSize<=0) m_l2CacheSize = 1 * 1024 * 1024; } if(action==SetAction) diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h index 810bbfacd..5bad8e37e 100644 --- a/Eigen/src/Core/util/Memory.h +++ b/Eigen/src/Core/util/Memory.h @@ -603,6 +603,7 @@ public: * \returns the size in Bytes of the L1 data cache */ inline std::ptrdiff_t ei_queryL1CacheSize() { + #ifdef EIGEN_CPUID int abcd[4]; // try the direct method using extended level @@ -640,17 +641,24 @@ inline std::ptrdiff_t ei_queryL1CacheSize() } return l1*1024; + #else + return -1; + #endif } /** \internal * \returns the size in Bytes of the L2 or L3 cache if this later is present */ inline std::ptrdiff_t ei_queryTopLevelCacheSize() { + #ifdef EIGEN_CPUID int abcd[4]; EIGEN_CPUID(abcd,0x80000006); std::ptrdiff_t l2 = std::ptrdiff_t(abcd[2] >> 16) * 1024; std::ptrdiff_t l3 = std::ptrdiff_t((abcd[3] & 0xFFFC000) >> 18) * 512 * 1024; return std::max(l2,l3); + #else + return -1; + #endif } #endif // EIGEN_MEMORY_H diff --git a/bench/bench_gemm.cpp b/bench/bench_gemm.cpp index ca1e05c8d..e5b991130 100644 --- a/bench/bench_gemm.cpp +++ b/bench/bench_gemm.cpp @@ -65,8 +65,10 @@ void gemm(const M& a, const M& b, M& c) int main(int argc, char ** argv) { - std::cout << "L1 cache size = " << ei_queryL1CacheSize()/1024 << " KB\n"; - std::cout << "L2/L3 cache size = " << ei_queryTopLevelCacheSize()/1024 << " KB\n"; + std::ptrdiff_t l1 = ei_queryL1CacheSize(); + std::ptrdiff_t l2 = ei_queryTopLevelCacheSize(); + std::cout << "L1 cache size = " << (l1>0 ? l1/1024 : -1) << " KB\n"; + std::cout << "L2/L3 cache size = " << (l2>0 ? l2/1024 : -1) << " KB\n"; setCpuCacheSizes(ei_queryL1CacheSize()/1,ei_queryTopLevelCacheSize()/2); -- cgit v1.2.3