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