Support for QuRT OS (Hexagon RTOS) (#1497)

This commit is contained in:
Marat Dukhan 2022-10-04 12:43:27 -07:00 committed by GitHub
parent 49aa374da9
commit d2a8a4ee41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 57 additions and 7 deletions

View File

@ -1534,8 +1534,15 @@ class Fixture : public internal::Benchmark {
#endif #endif
// Helper macro to create a main routine in a test that runs the benchmarks // Helper macro to create a main routine in a test that runs the benchmarks
// Note the workaround for Hexagon simulator passing argc != 0, argv = NULL.
#define BENCHMARK_MAIN() \ #define BENCHMARK_MAIN() \
int main(int argc, char** argv) { \ int main(int argc, char** argv) { \
char arg0_default[] = "benchmark"; \
char* args_default = arg0_default; \
if (!argv) { \
argc = 1; \
argv = &args_default; \
} \
::benchmark::Initialize(&argc, argv); \ ::benchmark::Initialize(&argc, argv); \
if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1; \ if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1; \
::benchmark::RunSpecifiedBenchmarks(); \ ::benchmark::RunSpecifiedBenchmarks(); \

View File

@ -19,7 +19,7 @@
#include "internal_macros.h" #include "internal_macros.h"
#ifndef BENCHMARK_OS_WINDOWS #ifndef BENCHMARK_OS_WINDOWS
#ifndef BENCHMARK_OS_FUCHSIA #if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT)
#include <sys/resource.h> #include <sys/resource.h>
#endif #endif
#include <sys/time.h> #include <sys/time.h>

View File

@ -15,7 +15,7 @@
#include "benchmark_register.h" #include "benchmark_register.h"
#ifndef BENCHMARK_OS_WINDOWS #ifndef BENCHMARK_OS_WINDOWS
#ifndef BENCHMARK_OS_FUCHSIA #if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT)
#include <sys/resource.h> #include <sys/resource.h>
#endif #endif
#include <sys/time.h> #include <sys/time.h>

View File

@ -19,7 +19,7 @@
#include "internal_macros.h" #include "internal_macros.h"
#ifndef BENCHMARK_OS_WINDOWS #ifndef BENCHMARK_OS_WINDOWS
#ifndef BENCHMARK_OS_FUCHSIA #if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT)
#include <sys/resource.h> #include <sys/resource.h>
#endif #endif
#include <sys/time.h> #include <sys/time.h>

View File

@ -212,6 +212,10 @@ inline BENCHMARK_ALWAYS_INLINE int64_t Now() {
struct timeval tv; struct timeval tv;
gettimeofday(&tv, nullptr); gettimeofday(&tv, nullptr);
return static_cast<int64_t>(tv.tv_sec) * 1000000 + tv.tv_usec; return static_cast<int64_t>(tv.tv_sec) * 1000000 + tv.tv_usec;
#elif defined(__hexagon__)
uint64_t pcycle;
asm volatile("%0 = C15:14" : "=r"(pcycle));
return static_cast<double>(pcycle);
#else #else
// The soft failover to a generic implementation is automatic only for ARM. // The soft failover to a generic implementation is automatic only for ARM.
// For other platforms the developer is expected to make an attempt to create // For other platforms the developer is expected to make an attempt to create

View File

@ -85,6 +85,8 @@
#define BENCHMARK_OS_QNX 1 #define BENCHMARK_OS_QNX 1
#elif defined(__MVS__) #elif defined(__MVS__)
#define BENCHMARK_OS_ZOS 1 #define BENCHMARK_OS_ZOS 1
#elif defined(__hexagon__)
#define BENCHMARK_OS_QURT 1
#endif #endif
#if defined(__ANDROID__) && defined(__GLIBCXX__) #if defined(__ANDROID__) && defined(__GLIBCXX__)

View File

@ -36,7 +36,11 @@ void BenchmarkReporter::PrintBasicContext(std::ostream *out,
BM_CHECK(out) << "cannot be null"; BM_CHECK(out) << "cannot be null";
auto &Out = *out; auto &Out = *out;
#ifndef BENCHMARK_OS_QURT
// Date/time information is not available on QuRT.
// Attempting to get it via this call cause the binary to crash.
Out << LocalDateTimeString() << "\n"; Out << LocalDateTimeString() << "\n";
#endif
if (context.executable_name) if (context.executable_name)
Out << "Running " << context.executable_name << "\n"; Out << "Running " << context.executable_name << "\n";

View File

@ -23,7 +23,7 @@
#include <codecvt> #include <codecvt>
#else #else
#include <fcntl.h> #include <fcntl.h>
#ifndef BENCHMARK_OS_FUCHSIA #if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT)
#include <sys/resource.h> #include <sys/resource.h>
#endif #endif
#include <sys/time.h> #include <sys/time.h>
@ -42,6 +42,9 @@
#if defined(BENCHMARK_OS_QNX) #if defined(BENCHMARK_OS_QNX)
#include <sys/syspage.h> #include <sys/syspage.h>
#endif #endif
#if defined(BENCHMARK_OS_QURT)
#include <qurt.h>
#endif
#include <algorithm> #include <algorithm>
#include <array> #include <array>
@ -402,6 +405,8 @@ std::vector<CPUInfo::CacheInfo> GetCacheSizes() {
return GetCacheSizesWindows(); return GetCacheSizesWindows();
#elif defined(BENCHMARK_OS_QNX) #elif defined(BENCHMARK_OS_QNX)
return GetCacheSizesQNX(); return GetCacheSizesQNX();
#elif defined(BENCHMARK_OS_QURT)
return std::vector<CPUInfo::CacheInfo>();
#else #else
return GetCacheSizesFromKVFS(); return GetCacheSizesFromKVFS();
#endif #endif
@ -432,7 +437,15 @@ std::string GetSystemName() {
str = std::string(converted.data()); str = std::string(converted.data());
#endif #endif
return str; return str;
#else // defined(BENCHMARK_OS_WINDOWS) #elif defined(BENCHMARK_OS_QURT)
std::string str = "Hexagon DSP";
qurt_arch_version_t arch_version_struct;
if (qurt_sysenv_get_arch_version(&arch_version_struct) == QURT_EOK) {
str += " v";
str += std::to_string(arch_version_struct.arch_version);
}
return str;
#else
#ifndef HOST_NAME_MAX #ifndef HOST_NAME_MAX
#ifdef BENCHMARK_HAS_SYSCTL // BSD/Mac Doesnt have HOST_NAME_MAX defined #ifdef BENCHMARK_HAS_SYSCTL // BSD/Mac Doesnt have HOST_NAME_MAX defined
#define HOST_NAME_MAX 64 #define HOST_NAME_MAX 64
@ -479,6 +492,12 @@ int GetNumCPUs() {
return num_cpu; return num_cpu;
#elif defined(BENCHMARK_OS_QNX) #elif defined(BENCHMARK_OS_QNX)
return static_cast<int>(_syspage_ptr->num_cpu); return static_cast<int>(_syspage_ptr->num_cpu);
#elif defined(BENCHMARK_OS_QURT)
qurt_sysenv_max_hthreads_t hardware_threads;
if (qurt_sysenv_get_max_hw_threads(&hardware_threads) != QURT_EOK) {
hardware_threads.max_hthreads = 1;
}
return hardware_threads.max_hthreads;
#else #else
int num_cpus = 0; int num_cpus = 0;
int max_id = -1; int max_id = -1;
@ -678,6 +697,9 @@ double GetCPUCyclesPerSecond(CPUInfo::Scaling scaling) {
#elif defined(BENCHMARK_OS_QNX) #elif defined(BENCHMARK_OS_QNX)
return static_cast<double>((int64_t)(SYSPAGE_ENTRY(cpuinfo)->speed) * return static_cast<double>((int64_t)(SYSPAGE_ENTRY(cpuinfo)->speed) *
(int64_t)(1000 * 1000)); (int64_t)(1000 * 1000));
#elif defined(BENCHMARK_OS_QURT)
// QuRT doesn't provide any API to query Hexagon frequency.
return 1000000000;
#endif #endif
// If we've fallen through, attempt to roughly estimate the CPU clock rate. // If we've fallen through, attempt to roughly estimate the CPU clock rate.
static constexpr int estimate_time_ms = 1000; static constexpr int estimate_time_ms = 1000;

View File

@ -23,7 +23,7 @@
#include <windows.h> #include <windows.h>
#else #else
#include <fcntl.h> #include <fcntl.h>
#ifndef BENCHMARK_OS_FUCHSIA #if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT)
#include <sys/resource.h> #include <sys/resource.h>
#endif #endif
#include <sys/time.h> #include <sys/time.h>
@ -38,6 +38,9 @@
#include <mach/mach_port.h> #include <mach/mach_port.h>
#include <mach/thread_act.h> #include <mach/thread_act.h>
#endif #endif
#if defined(BENCHMARK_OS_QURT)
#include <qurt.h>
#endif
#endif #endif
#ifdef BENCHMARK_OS_EMSCRIPTEN #ifdef BENCHMARK_OS_EMSCRIPTEN
@ -79,7 +82,7 @@ double MakeTime(FILETIME const& kernel_time, FILETIME const& user_time) {
static_cast<double>(user.QuadPart)) * static_cast<double>(user.QuadPart)) *
1e-7; 1e-7;
} }
#elif !defined(BENCHMARK_OS_FUCHSIA) #elif !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT)
double MakeTime(struct rusage const& ru) { double MakeTime(struct rusage const& ru) {
return (static_cast<double>(ru.ru_utime.tv_sec) + return (static_cast<double>(ru.ru_utime.tv_sec) +
static_cast<double>(ru.ru_utime.tv_usec) * 1e-6 + static_cast<double>(ru.ru_utime.tv_usec) * 1e-6 +
@ -119,6 +122,10 @@ double ProcessCPUUsage() {
&user_time)) &user_time))
return MakeTime(kernel_time, user_time); return MakeTime(kernel_time, user_time);
DiagnoseAndExit("GetProccessTimes() failed"); DiagnoseAndExit("GetProccessTimes() failed");
#elif defined(BENCHMARK_OS_QURT)
return static_cast<double>(
qurt_timer_timetick_to_us(qurt_timer_get_ticks())) *
1.0e-6;
#elif defined(BENCHMARK_OS_EMSCRIPTEN) #elif defined(BENCHMARK_OS_EMSCRIPTEN)
// clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...) returns 0 on Emscripten. // clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...) returns 0 on Emscripten.
// Use Emscripten-specific API. Reported CPU time would be exactly the // Use Emscripten-specific API. Reported CPU time would be exactly the
@ -149,6 +156,10 @@ double ThreadCPUUsage() {
GetThreadTimes(this_thread, &creation_time, &exit_time, &kernel_time, GetThreadTimes(this_thread, &creation_time, &exit_time, &kernel_time,
&user_time); &user_time);
return MakeTime(kernel_time, user_time); return MakeTime(kernel_time, user_time);
#elif defined(BENCHMARK_OS_QURT)
return static_cast<double>(
qurt_timer_timetick_to_us(qurt_timer_get_ticks())) *
1.0e-6;
#elif defined(BENCHMARK_OS_MACOSX) #elif defined(BENCHMARK_OS_MACOSX)
// FIXME We want to use clock_gettime, but its not available in MacOS 10.11. // FIXME We want to use clock_gettime, but its not available in MacOS 10.11.
// See https://github.com/google/benchmark/pull/292 // See https://github.com/google/benchmark/pull/292