From 9328970352eb890fda7a3a367c14341e16eb7c24 Mon Sep 17 00:00:00 2001 From: Olli Lupton Date: Fri, 17 Dec 2021 12:53:43 +0100 Subject: [PATCH 1/2] Make function-local static var namespace-global. And declare the namespace-global version available on the target device when compiling with OpenMP. --- Eigen/src/Core/products/GeneralBlockPanelKernel.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/Eigen/src/Core/products/GeneralBlockPanelKernel.h index 40171eb83..5aaa52468 100644 --- a/Eigen/src/Core/products/GeneralBlockPanelKernel.h +++ b/Eigen/src/Core/products/GeneralBlockPanelKernel.h @@ -90,6 +90,14 @@ struct CacheSizes { std::ptrdiff_t m_l3; }; +#ifdef _OPENMP +#pragma omp declare target +#endif +CacheSizes m_cacheSizes; +#ifdef _OPENMP +#pragma omp end declare target +#endif + /** \internal */ EIGEN_DEVICE_FUNC inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1, std::ptrdiff_t* l2, std::ptrdiff_t* l3) @@ -118,7 +126,6 @@ inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1, std::ptrdiff eigen_internal_assert(false); } #else // EIGEN_CUDA_ARCH - static CacheSizes m_cacheSizes; if(action==SetAction) { From a25fab3207191c3fe2ec1e38df411a7ec9b72cb3 Mon Sep 17 00:00:00 2001 From: Olli Lupton Date: Tue, 21 Dec 2021 11:31:04 +0100 Subject: [PATCH 2/2] Fix ODR violations. --- .../Core/products/GeneralBlockPanelKernel.h | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/Eigen/src/Core/products/GeneralBlockPanelKernel.h index 5aaa52468..086e6c8f6 100644 --- a/Eigen/src/Core/products/GeneralBlockPanelKernel.h +++ b/Eigen/src/Core/products/GeneralBlockPanelKernel.h @@ -90,10 +90,17 @@ struct CacheSizes { std::ptrdiff_t m_l3; }; +// In C++17 this could be an inline variable, see for example +// https://stackoverflow.com/questions/38043442/how-do-inline-variables-work +template +struct CacheSizeGlobalHelper { + static CacheSizes s_cacheSizes; +}; #ifdef _OPENMP #pragma omp declare target #endif -CacheSizes m_cacheSizes; +template +CacheSizes CacheSizeGlobalHelper::s_cacheSizes; #ifdef _OPENMP #pragma omp end declare target #endif @@ -127,20 +134,21 @@ inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1, std::ptrdiff } #else // EIGEN_CUDA_ARCH + auto& cacheSizes = CacheSizeGlobalHelper::s_cacheSizes; if(action==SetAction) { // set the cpu cache size and cache all block sizes from a global cache size in byte eigen_internal_assert(l1!=0 && l2!=0); - m_cacheSizes.m_l1 = *l1; - m_cacheSizes.m_l2 = *l2; - m_cacheSizes.m_l3 = *l3; + cacheSizes.m_l1 = *l1; + cacheSizes.m_l2 = *l2; + cacheSizes.m_l3 = *l3; } else if(action==GetAction) { eigen_internal_assert(l1!=0 && l2!=0); - *l1 = m_cacheSizes.m_l1; - *l2 = m_cacheSizes.m_l2; - *l3 = m_cacheSizes.m_l3; + *l1 = cacheSizes.m_l1; + *l2 = cacheSizes.m_l2; + *l3 = cacheSizes.m_l3; } else {