mirror of https://github.com/google/benchmark.git
Support for QuRT OS (Hexagon RTOS) (#1497)
This commit is contained in:
parent
49aa374da9
commit
d2a8a4ee41
|
@ -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(); \
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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__)
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue