[PATCH 1011/1017] add pocl_get_distro_cpu_name()
authorAndreas Beckmann <anbe@debian.org>
Thu, 7 Apr 2022 10:04:05 +0000 (12:04 +0200)
committerAndreas Beckmann <anbe@debian.org>
Tue, 17 Jan 2023 13:11:18 +0000 (13:11 +0000)
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
lib/CL/pocl_llvm_utils.cc

index 31c3d99fa4c37494d219172dd0cc26d0c0392484..632c84defacdca52a9b132fa9771d7f5a17b6f13 100644 (file)
@@ -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 ();
 
index c2012234c53e549ba7a84be77fbd6017c545b09f..8274d98a92cfc66e52ee5cd7eb4a41fe17062e96 100644 (file)
@@ -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<bool> 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) {