From 55dc3a2dc252b327cf4dbdf117d38888881d04c8 Mon Sep 17 00:00:00 2001 From: hm-thinkbook16p Date: Wed, 29 Jul 2026 08:43:05 +0800 Subject: [PATCH] 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 in license_manager.cpp --- include/vde/core/concurrent_data.h | 25 ++++++++++++++----------- include/vde/core/performance_tuning.h | 26 ++++++++++++++++++++------ src/core/license_manager.cpp | 1 + 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/include/vde/core/concurrent_data.h b/include/vde/core/concurrent_data.h index fc15f5c..802a04a 100644 --- a/include/vde/core/concurrent_data.h +++ b/include/vde/core/concurrent_data.h @@ -24,6 +24,18 @@ #include #include +// MSVC 兼容层:GCC/Clang __builtin_ia32_pause → MSVC _mm_pause +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) +#include +#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(); } } } diff --git a/include/vde/core/performance_tuning.h b/include/vde/core/performance_tuning.h index 388895d..ffaea99 100644 --- a/include/vde/core/performance_tuning.h +++ b/include/vde/core/performance_tuning.h @@ -27,6 +27,20 @@ #include #include +// MSVC 兼容层:GCC/Clang __builtin_prefetch → MSVC _mm_prefetch +#if defined(_MSC_VER) +#include +#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(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 inline void prefetch_array(const void* base, size_t index) { const char* ptr = static_cast(base) + index * Stride * CACHE_LINE_SIZE; - __builtin_prefetch(ptr, 0, static_cast(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 inline void prefetch_next(const void* addr) { - __builtin_prefetch(addr, 0, 3); + VDE_PREFETCH(addr); } /// 预取写入(用于 scatter 操作) template 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(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); } } diff --git a/src/core/license_manager.cpp b/src/core/license_manager.cpp index b45a005..ce463d4 100644 --- a/src/core/license_manager.cpp +++ b/src/core/license_manager.cpp @@ -20,6 +20,7 @@ #include #include #include +#include namespace vde::core {