From: Andreas Beckmann Date: Thu, 7 Apr 2022 10:04:05 +0000 (+0200) Subject: [PATCH 1011/1017] add pocl_get_distro_cpu_name() X-Git-Tag: archive/raspbian/3.0-8+rpi1^2~18 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a9c30b31f53b065691d217847cc9c258de1abf2a;p=pocl.git [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 --- diff --git a/lib/CL/pocl_llvm.h b/lib/CL/pocl_llvm.h index 2f5f625..be5a1a0 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 857773f..7bdfb38 100644 --- a/lib/CL/pocl_llvm_utils.cc +++ b/lib/CL/pocl_llvm_utils.cc @@ -146,29 +146,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}}; @@ -196,6 +206,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) {