// ================================================================================================ // Audio Backend - SIMD函数分发器实现 // ================================================================================================ #include "function_dispatcher.h" #include namespace audio_backend::simd { // ================================================================================================ // 函数版本字符串转换实现 // ================================================================================================ const char* function_version_to_string(FunctionVersion version) { switch (version) { case FunctionVersion::SCALAR: return "SCALAR"; case FunctionVersion::SSE: return "SSE"; case FunctionVersion::SSE3: return "SSE3"; case FunctionVersion::SSE4: return "SSE4"; case FunctionVersion::AVX: return "AVX"; case FunctionVersion::AVX2: return "AVX2"; case FunctionVersion::AVX512: return "AVX512"; case FunctionVersion::NEON: return "NEON"; case FunctionVersion::NEON_FP16: return "NEON_FP16"; default: return "UNKNOWN"; } } FunctionVersion string_to_function_version(const std::string& str) { if (str == "SCALAR") return FunctionVersion::SCALAR; if (str == "SSE") return FunctionVersion::SSE; if (str == "SSE3") return FunctionVersion::SSE3; if (str == "SSE4") return FunctionVersion::SSE4; if (str == "AVX") return FunctionVersion::AVX; if (str == "AVX2") return FunctionVersion::AVX2; if (str == "AVX512") return FunctionVersion::AVX512; if (str == "NEON") return FunctionVersion::NEON; if (str == "NEON_FP16") return FunctionVersion::NEON_FP16; return FunctionVersion::SCALAR; // 默认回退到标量版本 } // ================================================================================================ // FunctionDispatcher实现 // ================================================================================================ void FunctionDispatcher::print_registry_status() const { std::cout << "\n=== SIMD函数注册状态 ===" << std::endl; std::cout << "已注册函数数量: " << function_registry_.size() << std::endl; // 获取当前CPU支持的最高SIMD级别 SIMDLevel max_level = get_max_simd_level(); SIMDLevel recommended_level = get_recommended_simd_level(); std::cout << "CPU最高SIMD级别: "; switch (max_level) { case SIMDLevel::NONE: std::cout << "None"; break; case SIMDLevel::SSE: std::cout << "SSE"; break; case SIMDLevel::SSE3: std::cout << "SSE3"; break; case SIMDLevel::SSE4: std::cout << "SSE4"; break; case SIMDLevel::AVX: std::cout << "AVX"; break; case SIMDLevel::AVX2: std::cout << "AVX2"; break; case SIMDLevel::AVX512: std::cout << "AVX-512"; break; case SIMDLevel::NEON: std::cout << "NEON"; break; case SIMDLevel::NEON_FP16: std::cout << "NEON_FP16"; break; } std::cout << std::endl; std::cout << "推荐SIMD级别: "; switch (recommended_level) { case SIMDLevel::NONE: std::cout << "None"; break; case SIMDLevel::SSE: std::cout << "SSE"; break; case SIMDLevel::SSE3: std::cout << "SSE3"; break; case SIMDLevel::SSE4: std::cout << "SSE4"; break; case SIMDLevel::AVX: std::cout << "AVX"; break; case SIMDLevel::AVX2: std::cout << "AVX2"; break; case SIMDLevel::AVX512: std::cout << "AVX-512"; break; case SIMDLevel::NEON: std::cout << "NEON"; break; case SIMDLevel::NEON_FP16: std::cout << "NEON_FP16"; break; } std::cout << std::endl; std::cout << "\n函数详情:" << std::endl; for (const auto& pair : function_registry_) { const std::string& name = pair.first; const auto& holder = pair.second; std::cout << " " << name << ":" << std::endl; // 获取可用版本 auto available_versions = holder->get_available_versions(); if (available_versions.empty()) { std::cout << " ❌ 无可用实现" << std::endl; } else { std::cout << " ✅ 可用版本: "; for (size_t i = 0; i < available_versions.size(); ++i) { if (i > 0) std::cout << ", "; std::cout << function_version_to_string(available_versions[i]); } std::cout << std::endl; // 显示将使用的版本 FunctionVersion preferred_version = simd_level_to_version(recommended_level); FunctionVersion selected_version = FunctionVersion::SCALAR; // 查找最佳匹配版本 for (int i = static_cast(preferred_version); i >= 0; --i) { FunctionVersion version = static_cast(i); auto it = std::find(available_versions.begin(), available_versions.end(), version); if (it != available_versions.end()) { selected_version = version; break; } } std::cout << " 🎯 将使用版本: " << function_version_to_string(selected_version) << std::endl; } } std::cout << "=========================" << std::endl; } } // namespace audio_backend::simd