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