fix(msvc): add MSVC compatibility for __builtin_prefetch and __builtin_ia32_pause
Replace GCC builtins with cross-platform macros: VDE_PREFETCH (MSVC _mm_prefetch), VDE_CPU_PAUSE (MSVC _mm_pause) Also add missing #include <unordered_map> in license_manager.cpp
This commit is contained in:
@@ -24,6 +24,18 @@
|
||||
#include <utility>
|
||||
#include <type_traits>
|
||||
|
||||
// MSVC 兼容层:GCC/Clang __builtin_ia32_pause → MSVC _mm_pause
|
||||
#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))
|
||||
#include <intrin.h>
|
||||
#define VDE_CPU_PAUSE() _mm_pause()
|
||||
#elif defined(__x86_64__) || defined(_M_X64)
|
||||
#define VDE_CPU_PAUSE() __builtin_ia32_pause()
|
||||
#elif defined(__aarch64__)
|
||||
#define VDE_CPU_PAUSE() __asm__ volatile("yield")
|
||||
#else
|
||||
#define VDE_CPU_PAUSE() ((void)0)
|
||||
#endif
|
||||
|
||||
namespace vde::core {
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════════════════
|
||||
@@ -486,12 +498,7 @@ public:
|
||||
}
|
||||
// 自适应退避
|
||||
if (spins > 100) {
|
||||
// PAUSE / YIELD
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
__builtin_ia32_pause();
|
||||
#elif defined(__aarch64__)
|
||||
__asm__ volatile("yield");
|
||||
#endif
|
||||
VDE_CPU_PAUSE();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -512,11 +519,7 @@ public:
|
||||
return;
|
||||
}
|
||||
if (spins > 100) {
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
__builtin_ia32_pause();
|
||||
#elif defined(__aarch64__)
|
||||
__asm__ volatile("yield");
|
||||
#endif
|
||||
VDE_CPU_PAUSE();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,20 @@
|
||||
#include <cstddef>
|
||||
#include <cstdlib>
|
||||
|
||||
// MSVC 兼容层:GCC/Clang __builtin_prefetch → MSVC _mm_prefetch
|
||||
#if defined(_MSC_VER)
|
||||
#include <intrin.h>
|
||||
#define VDE_PREFETCH(addr) _mm_prefetch((const char*)(addr), _MM_HINT_T0)
|
||||
#define VDE_PREFETCH_WRITE(addr) _mm_prefetch((const char*)(addr), _MM_HINT_T0)
|
||||
#define VDE_PREFETCH_DIST(addr, dist) \
|
||||
_mm_prefetch((const char*)(addr), (dist) > 1 ? _MM_HINT_T2 : _MM_HINT_T1)
|
||||
#else
|
||||
#define VDE_PREFETCH(addr) __builtin_prefetch((addr), 0, 3)
|
||||
#define VDE_PREFETCH_WRITE(addr) __builtin_prefetch((addr), 1, 3)
|
||||
#define VDE_PREFETCH_DIST(addr, dist) \
|
||||
__builtin_prefetch((addr), 0, static_cast<int>(dist) > 1 ? 2 : 3)
|
||||
#endif
|
||||
|
||||
namespace vde::core {
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════════════════
|
||||
@@ -307,7 +321,7 @@ struct CacheOptimizationHints {
|
||||
///
|
||||
/// @ingroup core
|
||||
inline void prefetch(const void* addr) {
|
||||
__builtin_prefetch(addr, 0, 3);
|
||||
VDE_PREFETCH(addr);
|
||||
}
|
||||
|
||||
/// 预取写入(使缓存行进入修改状态)
|
||||
@@ -316,7 +330,7 @@ inline void prefetch(const void* addr) {
|
||||
///
|
||||
/// @ingroup core
|
||||
inline void prefetch_write(const void* addr) {
|
||||
__builtin_prefetch(addr, 1, 3);
|
||||
VDE_PREFETCH_WRITE(addr);
|
||||
}
|
||||
|
||||
/// 防止假共享的填充字段
|
||||
@@ -566,7 +580,7 @@ template<size_t Stride = 1, PrefetchDistance Dist = PrefetchDistance::NEAR>
|
||||
inline void prefetch_array(const void* base, size_t index) {
|
||||
const char* ptr = static_cast<const char*>(base)
|
||||
+ index * Stride * CACHE_LINE_SIZE;
|
||||
__builtin_prefetch(ptr, 0, static_cast<int>(Dist) > 1 ? 2 : 3);
|
||||
VDE_PREFETCH_DIST(ptr, Dist);
|
||||
}
|
||||
|
||||
/// 预取下一个元素(循环优化)
|
||||
@@ -578,13 +592,13 @@ inline void prefetch_array(const void* base, size_t index) {
|
||||
/// @endcode
|
||||
template<size_t Lookahead = 4>
|
||||
inline void prefetch_next(const void* addr) {
|
||||
__builtin_prefetch(addr, 0, 3);
|
||||
VDE_PREFETCH(addr);
|
||||
}
|
||||
|
||||
/// 预取写入(用于 scatter 操作)
|
||||
template<size_t Lookahead = 4>
|
||||
inline void prefetch_write_next(void* addr) {
|
||||
__builtin_prefetch(addr, 1, 3);
|
||||
VDE_PREFETCH_WRITE(addr);
|
||||
}
|
||||
|
||||
/// 顺序预取批量数据
|
||||
@@ -598,7 +612,7 @@ inline void prefetch_range(const void* base, size_t count,
|
||||
const char* ptr = static_cast<const char*>(base);
|
||||
size_t limit = std::min(count, count);
|
||||
for (size_t i = 0; i < limit; i += distance) {
|
||||
__builtin_prefetch(ptr + i * stride, 0, 3);
|
||||
VDE_PREFETCH(ptr + i * stride);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user