From 7385151075ef3b012057ad3e15c3fe2bb71f1328 Mon Sep 17 00:00:00 2001 From: Andreas Beckmann Date: Thu, 7 Apr 2022 12:04:05 +0200 Subject: [PATCH] [PATCH 1011/1017] add pocl_get_distro_cpu_name() in distro builds, map each kernellib_name to a specific llvm_cpu which is then used as compilation target instead of the native cpu this limits the possible code generation targets in distro builds in order to be able to run tests against all of them with a minimal number of different (physical) CPU models Gbp-Pq: Name 1011-add-pocl_get_distro_cpu_name.patch --- lib/CL/pocl_llvm.h | 4 ++++ lib/CL/pocl_llvm_utils.cc | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/CL/pocl_llvm.h b/lib/CL/pocl_llvm.h index 31c3d99..632c84d 100644 --- a/lib/CL/pocl_llvm.h +++ b/lib/CL/pocl_llvm.h @@ -42,6 +42,10 @@ extern "C" { POCL_EXPORT const char *pocl_get_distro_kernellib_name (); + /* For distro builds, return the target cpu name for a kernellib name */ + POCL_EXPORT + const char *pocl_get_distro_cpu_name (const char *kernellib_name); + /* Returns if the cpu supports FMA instruction (uses LLVM). */ int cpu_has_fma (); diff --git a/lib/CL/pocl_llvm_utils.cc b/lib/CL/pocl_llvm_utils.cc index c201223..8274d98 100644 --- a/lib/CL/pocl_llvm_utils.cc +++ b/lib/CL/pocl_llvm_utils.cc @@ -150,29 +150,39 @@ char *pocl_get_llvm_cpu_name() { #ifdef KERNELLIB_HOST_DISTRO_VARIANTS const struct kernellib_features { const char *kernellib_name; + const char *cpu_name; const char *features[12]; } kernellib_feature_map[] = { // order the entries s.t. if a cpu matches multiple entries, the "best" match // comes last #if defined(__x86_64__) "sse2", + "athlon64", {"sse2", NULL}, "ssse3", + "core2", {"sse2", "ssse3", "cx16", NULL}, "sse41", + "penryn", {"sse2", "sse4.1", "cx16", NULL}, "avx", + "sandybridge", {"sse2", "avx", "cx16", "popcnt", NULL}, "avx_f16c", + "ivybridge", {"sse2", "avx", "cx16", "popcnt", "f16c", NULL}, "avx_fma4", + "bdver1", {"sse2", "avx", "cx16", "popcnt", "xop", "fma4", NULL}, "avx2", + "haswell", {"sse2", "avx", "avx2", "cx16", "popcnt", "lzcnt", "f16c", "fma", "bmi", "bmi2", NULL}, "avx512", + "skylake-avx512", {"sse2", "avx512f", NULL}, #endif + NULL, NULL, {NULL}}; @@ -200,6 +210,25 @@ const char *pocl_get_distro_kernellib_name() { return best_match->kernellib_name; } + +/* for "distro" style kernel libs, return which target cpu to use for a given + * kernellib */ +const char *pocl_get_distro_cpu_name(const char *kernellib_name) { + StringMap Features; + + if (!llvm::sys::getHostCPUFeatures(Features)) + POCL_ABORT("LLVM can't get host CPU flags!\n"); + + const kernellib_features *best_match = NULL; + for (const kernellib_features *kf = kernellib_feature_map; kf->kernellib_name; + ++kf) { + if (!strcmp(kernellib_name, kf->kernellib_name)) + return kf->cpu_name; + } + + POCL_ABORT("Can't find a cpu name matching the kernellib (%s)\n", + kernellib_name); +} #endif int bitcode_is_triple(const char *bitcode, size_t size, const char *triple) { -- 2.30.2