From 7195f71b2e44e2119b1763fde02b2cf3f9371a6b Mon Sep 17 00:00:00 2001 From: Kevin Lo Date: Fri, 7 Jan 2022 15:46:02 +0800 Subject: Add OpenBSD/arm64 support. Signed-off-by: Kevin Lo Change-Id: I6f29bdb55caeec8893f128fdd50bdcc3d058cb3c Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/6905 Reviewed-by: Georgios Pinitas Reviewed-by: Pablo Marquez Tello Comments-Addressed: Pablo Marquez Tello Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins --- SConscript | 5 +++-- SConstruct | 10 +++++++--- src/common/cpuinfo/CpuInfo.cpp | 20 ++++++++++---------- .../NEON/kernels/arm_gemm/gemm_hybrid_indirect.hpp | 2 ++ .../NEON/kernels/arm_gemm/interleave_indirect.cpp | 2 ++ src/core/NEON/kernels/arm_gemm/transform.cpp | 2 ++ src/cpu/CpuContext.cpp | 4 ++-- src/runtime/CPP/CPPScheduler.cpp | 4 ++-- tests/framework/instruments/Instruments.h | 4 ++-- 9 files changed, 32 insertions(+), 21 deletions(-) diff --git a/SConscript b/SConscript index 320538e2e5..d8dcaadd15 100644 --- a/SConscript +++ b/SConscript @@ -295,7 +295,7 @@ arm_compute_env = env.Clone() version_file = arm_compute_env.Command("src/core/arm_compute_version.embed", "", action=create_version_file) arm_compute_env.AlwaysBuild(version_file) -default_cpp_compiler = 'g++' if env['os'] not in ['android', 'macos'] else 'clang++' +default_cpp_compiler = 'g++' if env['os'] not in ['android', 'macos', 'openbsd'] else 'clang++' cpp_compiler = os.environ.get('CXX', default_cpp_compiler) # Generate embed files @@ -455,7 +455,8 @@ undefined_flag = '-Wl,-undefined,error' if 'macos' in arm_compute_env["os"] else arm_compute_env.Append(LINKFLAGS=[undefined_flag]) arm_compute_env.Append(CPPPATH =[Dir("./src/core/").path] ) -arm_compute_env.Append(LIBS = ['dl']) +if env['os'] != 'openbsd': + arm_compute_env.Append(LIBS = ['dl']) # Load build definitions file with (open(Dir('#').path + '/filedefs.json')) as fd: diff --git a/SConstruct b/SConstruct index 13f839b324..425c77643a 100644 --- a/SConstruct +++ b/SConstruct @@ -94,7 +94,7 @@ vars.AddVariables( allowed_values=("armv7a", "armv7a-hf", "arm64-v8a", "arm64-v8.2-a", "arm64-v8.2-a-sve", "arm64-v8.2-a-sve2", "x86_32", "x86_64", "armv8a", "armv8.2-a", "armv8.2-a-sve", "armv8.6-a", "armv8.6-a-sve", "armv8.6-a-sve2", "armv8r64", "x86")), EnumVariable("estate", "Execution State", "auto", allowed_values=("auto", "32", "64")), - EnumVariable("os", "Target OS", "linux", allowed_values=("linux", "android", "tizen", "macos", "bare_metal")), + EnumVariable("os", "Target OS", "linux", allowed_values=("linux", "android", "tizen", "macos", "bare_metal", "openbsd")), EnumVariable("build", "Build type", "cross_compile", allowed_values=("native", "cross_compile", "embed_only")), BoolVariable("examples", "Build example programs", True), BoolVariable("gemm_tuner", "Build gemm_tuner programs", True), @@ -207,8 +207,8 @@ env.Append(CXXFLAGS = ['-Wall','-DARCH_ARM', env.Append(CPPDEFINES = ['_GLIBCXX_USE_NANOSLEEP']) -default_cpp_compiler = 'g++' if env['os'] not in ['android', 'macos'] else 'clang++' -default_c_compiler = 'gcc' if env['os'] not in ['android', 'macos'] else 'clang' +default_cpp_compiler = 'g++' if env['os'] not in ['android', 'macos', 'openbsd'] else 'clang++' +default_c_compiler = 'gcc' if env['os'] not in ['android', 'macos', 'openbsd'] else 'clang' cpp_compiler = os.environ.get('CXX', default_cpp_compiler) c_compiler = os.environ.get('CC', default_c_compiler) @@ -427,6 +427,10 @@ if env['opencl']: if env["os"] not in ["android", "bare_metal"] and (env['opencl'] or env['cppthreads']): env.Append(LIBS = ['pthread']) +if env['os'] == 'openbsd': + env.Append(LIBS = ['c']) + env.Append(CXXFLAGS = ['-fPIC']) + if env['opencl']: if env['embed_kernels']: env.Append(CPPDEFINES = ['EMBEDDED_KERNELS']) diff --git a/src/common/cpuinfo/CpuInfo.cpp b/src/common/cpuinfo/CpuInfo.cpp index b96e108af5..2b85375654 100644 --- a/src/common/cpuinfo/CpuInfo.cpp +++ b/src/common/cpuinfo/CpuInfo.cpp @@ -40,13 +40,13 @@ #include #endif /* !defined(BARE_METAL) */ -#if !defined(BARE_METAL) && !defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) +#if !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) #include /* Get HWCAP bits from asm/hwcap.h */ #include #elif defined(__APPLE__) && defined(__aarch64__) #include #include -#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) */ +#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) */ #define ARM_COMPUTE_CPU_FEATURE_HWCAP_CPUID (1 << 11) #define ARM_COMPUTE_GET_FEATURE_REG(var, freg) __asm __volatile("MRS %0, " #freg \ @@ -57,7 +57,7 @@ namespace cpuinfo { namespace { -#if !defined(BARE_METAL) && !defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) +#if !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) /** Extract MIDR using CPUID information that are exposed to user-space * * @param[in] max_num_cpus Maximum number of possible CPUs @@ -273,7 +273,7 @@ int get_hw_capability(const std::string& cap) sysctlbyname(cap.c_str(), &result, &size, NULL, 0); return result; } -#endif /* defined(__aarch64__) && defined(__APPLE__) */ +#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) */ #if defined(BARE_METAL) && defined(__aarch64__) uint64_t get_sve_feature_reg() @@ -297,7 +297,7 @@ CpuInfo::CpuInfo(CpuIsaInfo isa, std::vector cpus) CpuInfo CpuInfo::build() { -#if !defined(BARE_METAL) && !defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) +#if !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) const uint32_t hwcaps = getauxval(AT_HWCAP); const uint32_t hwcaps2 = getauxval(AT_HWCAP2); const uint32_t max_cpus = get_max_cpus(); @@ -328,7 +328,7 @@ CpuInfo CpuInfo::build() CpuInfo info(isa, cpus_model); return info; -#elif(BARE_METAL) && defined(__aarch64__) /* !defined(BARE_METAL) && !defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) */ +#elif(BARE_METAL) && defined(__aarch64__) /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) */ // Assume single CPU in bare metal mode. Just read the ID register and feature bits directly. uint64_t isar0 = 0, isar1 = 0, pfr0 = 0, svefr0 = 0, midr = 0; @@ -357,7 +357,7 @@ CpuInfo CpuInfo::build() #else /* #elif defined(__aarch64__) && defined(__APPLE__) */ CpuInfo info(CpuIsaInfo(), { CpuModel::GENERIC }); return info; -#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) */ +#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) */ } CpuModel CpuInfo::cpu_model(uint32_t cpuid) const @@ -371,11 +371,11 @@ CpuModel CpuInfo::cpu_model(uint32_t cpuid) const CpuModel CpuInfo::cpu_model() const { -#if defined(BARE_METAL) || defined(__APPLE__) || (!defined(__arm__) && !defined(__aarch64__)) +#if defined(BARE_METAL) || defined(__APPLE__) || defined(__OpenBSD__) || (!defined(__arm__) && !defined(__aarch64__)) return cpu_model(0); -#else /* defined(BARE_METAL) || defined(__APPLE__) || (!defined(__arm__) && !defined(__aarch64__)) */ +#else /* defined(BARE_METAL) || defined(__APPLE__) || defined(__OpenBSD__) || (!defined(__arm__) && !defined(__aarch64__)) */ return cpu_model(sched_getcpu()); -#endif /* defined(BARE_METAL) || defined(__APPLE__) || (!defined(__arm__) && !defined(__aarch64__)) */ +#endif /* defined(BARE_METAL) || defined(__APPLE__) || defined(__OpenBSD__) || (!defined(__arm__) && !defined(__aarch64__)) */ } uint32_t CpuInfo::num_cpus() const diff --git a/src/core/NEON/kernels/arm_gemm/gemm_hybrid_indirect.hpp b/src/core/NEON/kernels/arm_gemm/gemm_hybrid_indirect.hpp index 20c8230148..79fc65e561 100644 --- a/src/core/NEON/kernels/arm_gemm/gemm_hybrid_indirect.hpp +++ b/src/core/NEON/kernels/arm_gemm/gemm_hybrid_indirect.hpp @@ -23,7 +23,9 @@ */ #pragma once +#if !defined(__OpenBSD__) #include +#endif /* !defined(__OpenBSD__) */ #include #include diff --git a/src/core/NEON/kernels/arm_gemm/interleave_indirect.cpp b/src/core/NEON/kernels/arm_gemm/interleave_indirect.cpp index d5003e4a19..91988e8c33 100644 --- a/src/core/NEON/kernels/arm_gemm/interleave_indirect.cpp +++ b/src/core/NEON/kernels/arm_gemm/interleave_indirect.cpp @@ -28,7 +28,9 @@ #include "interleave_indirect.hpp" #include "bfloat.hpp" +#if !defined(__OpenBSD__) #include +#endif /* !defined(__OpenBSD__) */ #include #include diff --git a/src/core/NEON/kernels/arm_gemm/transform.cpp b/src/core/NEON/kernels/arm_gemm/transform.cpp index 60376ab80b..c6a3bc0edb 100644 --- a/src/core/NEON/kernels/arm_gemm/transform.cpp +++ b/src/core/NEON/kernels/arm_gemm/transform.cpp @@ -25,7 +25,9 @@ #include "bfloat.hpp" +#if !defined(__OpenBSD__) #include +#endif /* !defined(__OpenBSD__) */ namespace arm_gemm { diff --git a/src/cpu/CpuContext.cpp b/src/cpu/CpuContext.cpp index 917bf68a0c..0cc5070917 100644 --- a/src/cpu/CpuContext.cpp +++ b/src/cpu/CpuContext.cpp @@ -28,9 +28,9 @@ #include "src/cpu/CpuTensor.h" #include -#if !defined(__APPLE__) +#if !defined(__APPLE__) && !defined(__OpenBSD__) #include -#endif // !defined(__APPLE__) +#endif // !defined(__APPLE__) && !defined(__OpenBSD__) namespace arm_compute diff --git a/src/runtime/CPP/CPPScheduler.cpp b/src/runtime/CPP/CPPScheduler.cpp index 3d7f1f16b1..94a2f31d64 100644 --- a/src/runtime/CPP/CPPScheduler.cpp +++ b/src/runtime/CPP/CPPScheduler.cpp @@ -104,12 +104,12 @@ void set_thread_affinity(int core_id) return; } -#if !defined(__APPLE__) +#if !defined(__APPLE__) && !defined(__OpenBSD__) cpu_set_t set; CPU_ZERO(&set); CPU_SET(core_id, &set); ARM_COMPUTE_EXIT_ON_MSG(sched_setaffinity(0, sizeof(set), &set), "Error setting thread affinity"); -#endif /* !defined(__APPLE__) */ +#endif /* !defined(__APPLE__) && !defined(__OpenBSD__) */ } /** There are currently 2 scheduling modes supported by CPPScheduler diff --git a/tests/framework/instruments/Instruments.h b/tests/framework/instruments/Instruments.h index 8a6cec0e9c..28c994b119 100644 --- a/tests/framework/instruments/Instruments.h +++ b/tests/framework/instruments/Instruments.h @@ -24,12 +24,12 @@ #ifndef ARM_COMPUTE_TEST_INSTRUMENTS #define ARM_COMPUTE_TEST_INSTRUMENTS -#if !defined(BARE_METAL) && !defined(__APPLE__) +#if !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) #include "MaliCounter.h" #include "OpenCLMemoryUsage.h" #include "OpenCLTimer.h" #include "PMUCounter.h" -#endif /* !defined(BARE_METAL) && !defined(__APPLE__) */ +#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) */ #include "SchedulerTimer.h" #include "WallClockTimer.h" -- cgit v1.2.1