xref: /aosp_15_r20/external/gemmlowp/internal/platform.h (revision 5f39d1b313f0528e11bae88b3029b54b9e1033e7)
1*5f39d1b3SJooyung Han // Copyright 2015 The Gemmlowp Authors. All Rights Reserved.
2*5f39d1b3SJooyung Han //
3*5f39d1b3SJooyung Han // Licensed under the Apache License, Version 2.0 (the "License");
4*5f39d1b3SJooyung Han // you may not use this file except in compliance with the License.
5*5f39d1b3SJooyung Han // You may obtain a copy of the License at
6*5f39d1b3SJooyung Han //
7*5f39d1b3SJooyung Han //     http://www.apache.org/licenses/LICENSE-2.0
8*5f39d1b3SJooyung Han //
9*5f39d1b3SJooyung Han // Unless required by applicable law or agreed to in writing, software
10*5f39d1b3SJooyung Han // distributed under the License is distributed on an "AS IS" BASIS,
11*5f39d1b3SJooyung Han // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*5f39d1b3SJooyung Han // See the License for the specific language governing permissions and
13*5f39d1b3SJooyung Han // limitations under the License.
14*5f39d1b3SJooyung Han 
15*5f39d1b3SJooyung Han // internal/platform.h: a place to put platform specific code
16*5f39d1b3SJooyung Han 
17*5f39d1b3SJooyung Han #ifndef GEMMLOWP_INTERNAL_PLATFORM_H_
18*5f39d1b3SJooyung Han #define GEMMLOWP_INTERNAL_PLATFORM_H_
19*5f39d1b3SJooyung Han 
20*5f39d1b3SJooyung Han #ifdef _WIN32
21*5f39d1b3SJooyung Han #include <malloc.h>
22*5f39d1b3SJooyung Han #include <windows.h>
23*5f39d1b3SJooyung Han #else
24*5f39d1b3SJooyung Han #include <stdlib.h>
25*5f39d1b3SJooyung Han #include <time.h>
26*5f39d1b3SJooyung Han #include <unistd.h>
27*5f39d1b3SJooyung Han #endif
28*5f39d1b3SJooyung Han 
29*5f39d1b3SJooyung Han #ifdef __APPLE__
30*5f39d1b3SJooyung Han #include <sys/time.h>
31*5f39d1b3SJooyung Han #endif
32*5f39d1b3SJooyung Han 
33*5f39d1b3SJooyung Han #if defined ANDROID || defined __ANDROID__
34*5f39d1b3SJooyung Han #include <malloc.h>
35*5f39d1b3SJooyung Han // The 18 here should be 16, but has to be 18 for now due
36*5f39d1b3SJooyung Han // to a Google-internal issue.
37*5f39d1b3SJooyung Han #if __ANDROID_API__ < 18
38*5f39d1b3SJooyung Han #define GEMMLOWP_USE_MEMALIGN
39*5f39d1b3SJooyung Han #endif
40*5f39d1b3SJooyung Han // posix_memalign is missing on some 4.1 x86 devices
41*5f39d1b3SJooyung Han #if __ANDROID_API__ == 18
42*5f39d1b3SJooyung Han #ifdef GEMMLOWP_X86_32
43*5f39d1b3SJooyung Han #define GEMMLOWP_USE_MEMALIGN
44*5f39d1b3SJooyung Han #endif
45*5f39d1b3SJooyung Han #endif
46*5f39d1b3SJooyung Han #endif
47*5f39d1b3SJooyung Han 
48*5f39d1b3SJooyung Han // Needed by chrome native builds
49*5f39d1b3SJooyung Han #ifndef _SC_NPROCESSORS_CONF
50*5f39d1b3SJooyung Han #define _SC_NPROCESSORS_CONF _SC_NPROCESSORS_ONLN
51*5f39d1b3SJooyung Han #endif
52*5f39d1b3SJooyung Han 
53*5f39d1b3SJooyung Han namespace gemmlowp {
54*5f39d1b3SJooyung Han 
55*5f39d1b3SJooyung Han #ifdef _WIN32
aligned_alloc(size_t alignment,size_t size)56*5f39d1b3SJooyung Han inline void *aligned_alloc(size_t alignment, size_t size) {
57*5f39d1b3SJooyung Han   return _aligned_malloc(size, alignment);
58*5f39d1b3SJooyung Han }
59*5f39d1b3SJooyung Han 
aligned_free(void * memptr)60*5f39d1b3SJooyung Han inline void aligned_free(void *memptr) { _aligned_free(memptr); }
61*5f39d1b3SJooyung Han 
GetHardwareConcurrency(int max_threads)62*5f39d1b3SJooyung Han inline int GetHardwareConcurrency(int max_threads) {
63*5f39d1b3SJooyung Han   if (max_threads == 0) {
64*5f39d1b3SJooyung Han     SYSTEM_INFO sysinfo;
65*5f39d1b3SJooyung Han     GetSystemInfo(&sysinfo);
66*5f39d1b3SJooyung Han     return sysinfo.dwNumberOfProcessors;
67*5f39d1b3SJooyung Han   }
68*5f39d1b3SJooyung Han   return max_threads;
69*5f39d1b3SJooyung Han }
70*5f39d1b3SJooyung Han 
real_time_in_seconds()71*5f39d1b3SJooyung Han inline double real_time_in_seconds() {
72*5f39d1b3SJooyung Han   __int64 wintime;
73*5f39d1b3SJooyung Han   GetSystemTimeAsFileTime((FILETIME *)&wintime);
74*5f39d1b3SJooyung Han   wintime -= 116444736000000000LL;  // 1jan1601 to 1jan1970
75*5f39d1b3SJooyung Han   return wintime / 10000000LL + wintime % 10000000LL * 100 * 1e-9;
76*5f39d1b3SJooyung Han }
77*5f39d1b3SJooyung Han 
78*5f39d1b3SJooyung Han #else
79*5f39d1b3SJooyung Han inline void *aligned_alloc(size_t alignment, size_t size) {
80*5f39d1b3SJooyung Han #ifdef GEMMLOWP_USE_MEMALIGN
81*5f39d1b3SJooyung Han   return memalign(alignment, size);
82*5f39d1b3SJooyung Han #else
83*5f39d1b3SJooyung Han   void *memptr;
84*5f39d1b3SJooyung Han   if (posix_memalign(&memptr, alignment, size)) {
85*5f39d1b3SJooyung Han     memptr = nullptr;
86*5f39d1b3SJooyung Han   }
87*5f39d1b3SJooyung Han   return memptr;
88*5f39d1b3SJooyung Han #endif
89*5f39d1b3SJooyung Han }
90*5f39d1b3SJooyung Han 
91*5f39d1b3SJooyung Han inline int GetHardwareConcurrency(int max_threads) {
92*5f39d1b3SJooyung Han   if (max_threads == 0) {
93*5f39d1b3SJooyung Han     static const int hardware_threads_count =
94*5f39d1b3SJooyung Han         static_cast<int>(sysconf(_SC_NPROCESSORS_CONF));
95*5f39d1b3SJooyung Han     return hardware_threads_count;
96*5f39d1b3SJooyung Han   }
97*5f39d1b3SJooyung Han   return max_threads;
98*5f39d1b3SJooyung Han }
99*5f39d1b3SJooyung Han 
100*5f39d1b3SJooyung Han inline void aligned_free(void *memptr) { free(memptr); }
101*5f39d1b3SJooyung Han 
102*5f39d1b3SJooyung Han inline double real_time_in_seconds() {
103*5f39d1b3SJooyung Han #ifdef __APPLE__
104*5f39d1b3SJooyung Han   timeval t;
105*5f39d1b3SJooyung Han   gettimeofday(&t, nullptr);
106*5f39d1b3SJooyung Han   return t.tv_sec + 1e-6 * t.tv_usec;
107*5f39d1b3SJooyung Han #else
108*5f39d1b3SJooyung Han   timespec t;
109*5f39d1b3SJooyung Han   clock_gettime(CLOCK_REALTIME, &t);
110*5f39d1b3SJooyung Han   return t.tv_sec + 1e-9 * t.tv_nsec;
111*5f39d1b3SJooyung Han #endif
112*5f39d1b3SJooyung Han }
113*5f39d1b3SJooyung Han 
114*5f39d1b3SJooyung Han #endif
115*5f39d1b3SJooyung Han }  // namespace gemmlowp
116*5f39d1b3SJooyung Han #endif  // GEMMLOWP_INTERNAL_PLATFORM_H_
117