@@ -90,6 +90,21 @@ struct CacheSizes {
9090 std::ptrdiff_t m_l3;
9191};
9292
93+ // In C++17 this could be an inline variable, see for example
94+ // https://stackoverflow.com/questions/38043442/how-do-inline-variables-work
95+ template <typename >
96+ struct CacheSizeGlobalHelper {
97+ static CacheSizes s_cacheSizes;
98+ };
99+ #ifdef _OPENMP
100+ #pragma omp declare target
101+ #endif
102+ template <typename T>
103+ CacheSizes CacheSizeGlobalHelper<T>::s_cacheSizes;
104+ #ifdef _OPENMP
105+ #pragma omp end declare target
106+ #endif
107+
93108/* * \internal */
94109EIGEN_DEVICE_FUNC
95110inline void manage_caching_sizes (Action action, std::ptrdiff_t * l1, std::ptrdiff_t * l2, std::ptrdiff_t * l3)
@@ -118,22 +133,22 @@ inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1, std::ptrdiff
118133 eigen_internal_assert (false );
119134 }
120135 #else // EIGEN_CUDA_ARCH
121- static CacheSizes m_cacheSizes;
122136
137+ auto & cacheSizes = CacheSizeGlobalHelper<void >::s_cacheSizes;
123138 if (action==SetAction)
124139 {
125140 // set the cpu cache size and cache all block sizes from a global cache size in byte
126141 eigen_internal_assert (l1!=0 && l2!=0 );
127- m_cacheSizes .m_l1 = *l1;
128- m_cacheSizes .m_l2 = *l2;
129- m_cacheSizes .m_l3 = *l3;
142+ cacheSizes .m_l1 = *l1;
143+ cacheSizes .m_l2 = *l2;
144+ cacheSizes .m_l3 = *l3;
130145 }
131146 else if (action==GetAction)
132147 {
133148 eigen_internal_assert (l1!=0 && l2!=0 );
134- *l1 = m_cacheSizes .m_l1 ;
135- *l2 = m_cacheSizes .m_l2 ;
136- *l3 = m_cacheSizes .m_l3 ;
149+ *l1 = cacheSizes .m_l1 ;
150+ *l2 = cacheSizes .m_l2 ;
151+ *l3 = cacheSizes .m_l3 ;
137152 }
138153 else
139154 {
0 commit comments