1b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes/*
2b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * Copyright (C) 2015 The Android Open Source Project
3b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes *
4b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * Licensed under the Apache License, Version 2.0 (the "License");
5b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * you may not use this file except in compliance with the License.
6b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * You may obtain a copy of the License at
7b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes *
8b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes *      http://www.apache.org/licenses/LICENSE-2.0
9b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes *
10b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * Unless required by applicable law or agreed to in writing, software
11b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * distributed under the License is distributed on an "AS IS" BASIS,
12b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * See the License for the specific language governing permissions and
14b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes * limitations under the License.
15b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes */
16b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
17b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include <stdlib.h>
18b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include <stdio.h>
19b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes//#include <fcntl.h>
20b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes//#include <unistd.h>
21b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include <math.h>
22b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include <inttypes.h>
23b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include <time.h>
24b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include <android/log.h>
25b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
26b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include "jni.h"
27b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#include "Bench.h"
28b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
29b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes#define FUNC(name) Java_com_android_benchmark_synthetic_TestInterface_##name
30b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
31b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesstatic uint64_t GetTime() {
32b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    struct timespec t;
33b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    clock_gettime(CLOCK_MONOTONIC, &t);
34b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000);
35b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
36b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
37b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesextern "C" {
38b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
39b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesjlong Java_com_android_benchmark_synthetic_TestInterface_nInit(JNIEnv *_env, jobject _this, jlong options) {
40b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = new Bench();
41b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    bool ret = b->init();
42b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
43b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    if (ret) {
44b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        return (jlong)b;
45b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    }
46b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
47b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    delete b;
48b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return 0;
49b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
50b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
51b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesvoid Java_com_android_benchmark_synthetic_TestInterface_nDestroy(JNIEnv *_env, jobject _this, jlong _b) {
52b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
53b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
54b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    delete b;
55b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
56b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
57b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesjboolean Java_com_android_benchmark_synthetic_TestInterface_nRunPowerManagementTest(
58b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b, jlong options) {
59b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
60b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return b->runPowerManagementTest(options);
61b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
62b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
63b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesjboolean Java_com_android_benchmark_synthetic_TestInterface_nRunCPUHeatSoakTest(
64b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b, jlong options) {
65b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
66b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return b->runCPUHeatSoak(options);
67b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
68b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
69b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesfloat Java_com_android_benchmark_synthetic_TestInterface_nGetData(
70b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b, jfloatArray data) {
71b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
72b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
73b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    jsize len = _env->GetArrayLength(data);
74b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    float * ptr = _env->GetFloatArrayElements(data, 0);
75b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
76b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    b->getData(ptr, len);
77b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
78b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    _env->ReleaseFloatArrayElements(data, (jfloat *)ptr, 0);
79b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
80b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return 0;
81b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
82b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
83b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesjboolean Java_com_android_benchmark_synthetic_TestInterface_nMemTestStart(
84b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b) {
85b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
86b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return b->startMemTests();
87b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
88b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
89b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesfloat Java_com_android_benchmark_synthetic_TestInterface_nMemTestBandwidth(
90b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b, jlong opt) {
91b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
92b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return b->runMemoryBandwidthTest(opt);
93b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
94b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
95b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesfloat Java_com_android_benchmark_synthetic_TestInterface_nGFlopsTest(
96b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b, jlong opt) {
97b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
98b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return b->runGFlopsTest(opt);
99b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
100b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
101b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesfloat Java_com_android_benchmark_synthetic_TestInterface_nMemTestLatency(
102b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b, jlong opt) {
103b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
104b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return b->runMemoryLatencyTest(opt);
105b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
106b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
107b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesvoid Java_com_android_benchmark_synthetic_TestInterface_nMemTestEnd(
108b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong _b) {
109b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Bench *b = (Bench *)_b;
110b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    b->endMemTests();
111b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
112b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
113b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesfloat Java_com_android_benchmark_synthetic_TestInterface_nMemoryTest(
114b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jint subtest) {
115b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
116b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    uint8_t * volatile m1 = (uint8_t *)malloc(1024*1024*64);
117b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    uint8_t * m2 = (uint8_t *)malloc(1024*1024*64);
118b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
119b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    memset(m1, 0, 1024*1024*16);
120b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    memset(m2, 0, 1024*1024*16);
121b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
122b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    //__android_log_print(ANDROID_LOG_INFO, "bench", "test %i  %p  %p", subtest, m1, m2);
123b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
124b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
125b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    size_t loopCount = 0;
126b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    uint64_t start = GetTime();
127b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    while((GetTime() - start) < 1000000000) {
128b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        memcpy(m1, m2, subtest);
129b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        loopCount++;
130b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    }
131b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    if (loopCount == 0) {
132b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        loopCount = 1;
133b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    }
134b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
135b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    size_t count = loopCount;
136b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    uint64_t t1 = GetTime();
137b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    while (loopCount > 0) {
138b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        memcpy(m1, m2, subtest);
139b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        loopCount--;
140b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    }
141b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    uint64_t t2 = GetTime();
142b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
143b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    double dt = t2 - t1;
144b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    dt /= 1000 * 1000 * 1000;
145b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    double bw = ((double)subtest) * count / dt;
146b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
147b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    bw /= 1024 * 1024 * 1024;
148b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
149b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    __android_log_print(ANDROID_LOG_INFO, "bench", "size %i, bw %f", subtest, bw);
150b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
151b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    free (m1);
152b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    free (m2);
153b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return (float)bw;
154b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
155b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
156b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesjlong Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestMalloc(
157b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jint bytes) {
158b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    uint8_t *p = (uint8_t *)malloc(bytes);
159b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    memset(p, 0, bytes);
160b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return (jlong)p;
161b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
162b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
163b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesvoid Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestFree(
164b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong ptr) {
165b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    free((void *)ptr);
166b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
167b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
168b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesjlong Java_com_android_benchmark_synthetic_MemoryAvailableLoad2_nMemTestMalloc(
169b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jint bytes) {
170b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    return Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestMalloc(_env, _this, bytes);
171b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
172b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
173b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandesvoid Java_com_android_benchmark_synthetic_MemoryAvailableLoad2_nMemTestFree(
174b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes        JNIEnv *_env, jobject _this, jlong ptr) {
175b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes    Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestFree(_env, _this, ptr);
176b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}
177b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes
178b5fbd41b23bf309e6b420a3df4641603d55dcb68Joel Fernandes}; // extern "C"
179