Files
Alicho/src/simd/function_dispatcher.cpp
2025-10-24 18:17:58 +08:00

120 lines
5.3 KiB
C++

// ================================================================================================
// Audio Backend - SIMD函数分发器实现
// ================================================================================================
#include "function_dispatcher.h"
#include <iostream>
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<int>(preferred_version); i >= 0; --i) {
FunctionVersion version = static_cast<FunctionVersion>(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