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:
2026-07-29 08:43:05 +08:00
parent 6766267cf5
commit 55dc3a2dc2
3 changed files with 35 additions and 17 deletions
+14 -11
View File
@@ -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();
}
}
}
+20 -6
View File
@@ -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);
}
}