/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include <stdio.h>
//#include <fcntl.h>
//#include <unistd.h>
#include <math.h>
#include <inttypes.h>
#include <time.h>
#include <android/log.h>
#include "jni.h"
#include "Bench.h"
#define FUNC(name) Java_com_android_benchmark_synthetic_TestInterface_##name
static uint64_t GetTime() {
struct timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000);
}
extern "C" {
jlong Java_com_android_benchmark_synthetic_TestInterface_nInit(JNIEnv *_env, jobject _this, jlong options) {
Bench *b = new Bench();
bool ret = b->init();
if (ret) {
return (jlong)b;
}
delete b;
return 0;
}
void Java_com_android_benchmark_synthetic_TestInterface_nDestroy(JNIEnv *_env, jobject _this, jlong _b) {
Bench *b = (Bench *)_b;
delete b;
}
jboolean Java_com_android_benchmark_synthetic_TestInterface_nRunPowerManagementTest(
JNIEnv *_env, jobject _this, jlong _b, jlong options) {
Bench *b = (Bench *)_b;
return b->runPowerManagementTest(options);
}
jboolean Java_com_android_benchmark_synthetic_TestInterface_nRunCPUHeatSoakTest(
JNIEnv *_env, jobject _this, jlong _b, jlong options) {
Bench *b = (Bench *)_b;
return b->runCPUHeatSoak(options);
}
float Java_com_android_benchmark_synthetic_TestInterface_nGetData(
JNIEnv *_env, jobject _this, jlong _b, jfloatArray data) {
Bench *b = (Bench *)_b;
jsize len = _env->GetArrayLength(data);
float * ptr = _env->GetFloatArrayElements(data, 0);
b->getData(ptr, len);
_env->ReleaseFloatArrayElements(data, (jfloat *)ptr, 0);
return 0;
}
jboolean Java_com_android_benchmark_synthetic_TestInterface_nMemTestStart(
JNIEnv *_env, jobject _this, jlong _b) {
Bench *b = (Bench *)_b;
return b->startMemTests();
}
float Java_com_android_benchmark_synthetic_TestInterface_nMemTestBandwidth(
JNIEnv *_env, jobject _this, jlong _b, jlong opt) {
Bench *b = (Bench *)_b;
return b->runMemoryBandwidthTest(opt);
}
float Java_com_android_benchmark_synthetic_TestInterface_nGFlopsTest(
JNIEnv *_env, jobject _this, jlong _b, jlong opt) {
Bench *b = (Bench *)_b;
return b->runGFlopsTest(opt);
}
float Java_com_android_benchmark_synthetic_TestInterface_nMemTestLatency(
JNIEnv *_env, jobject _this, jlong _b, jlong opt) {
Bench *b = (Bench *)_b;
return b->runMemoryLatencyTest(opt);
}
void Java_com_android_benchmark_synthetic_TestInterface_nMemTestEnd(
JNIEnv *_env, jobject _this, jlong _b) {
Bench *b = (Bench *)_b;
b->endMemTests();
}
float Java_com_android_benchmark_synthetic_TestInterface_nMemoryTest(
JNIEnv *_env, jobject _this, jint subtest) {
uint8_t * volatile m1 = (uint8_t *)malloc(1024*1024*64);
uint8_t * m2 = (uint8_t *)malloc(1024*1024*64);
memset(m1, 0, 1024*1024*16);
memset(m2, 0, 1024*1024*16);
//__android_log_print(ANDROID_LOG_INFO, "bench", "test %i %p %p", subtest, m1, m2);
size_t loopCount = 0;
uint64_t start = GetTime();
while((GetTime() - start) < 1000000000) {
memcpy(m1, m2, subtest);
loopCount++;
}
if (loopCount == 0) {
loopCount = 1;
}
size_t count = loopCount;
uint64_t t1 = GetTime();
while (loopCount > 0) {
memcpy(m1, m2, subtest);
loopCount--;
}
uint64_t t2 = GetTime();
double dt = t2 - t1;
dt /= 1000 * 1000 * 1000;
double bw = ((double)subtest) * count / dt;
bw /= 1024 * 1024 * 1024;
__android_log_print(ANDROID_LOG_INFO, "bench", "size %i, bw %f", subtest, bw);
free (m1);
free (m2);
return (float)bw;
}
jlong Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestMalloc(
JNIEnv *_env, jobject _this, jint bytes) {
uint8_t *p = (uint8_t *)malloc(bytes);
memset(p, 0, bytes);
return (jlong)p;
}
void Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestFree(
JNIEnv *_env, jobject _this, jlong ptr) {
free((void *)ptr);
}
jlong Java_com_android_benchmark_synthetic_MemoryAvailableLoad2_nMemTestMalloc(
JNIEnv *_env, jobject _this, jint bytes) {
return Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestMalloc(_env, _this, bytes);
}
void Java_com_android_benchmark_synthetic_MemoryAvailableLoad2_nMemTestFree(
JNIEnv *_env, jobject _this, jlong ptr) {
Java_com_android_benchmark_synthetic_MemoryAvailableLoad1_nMemTestFree(_env, _this, ptr);
}
}; // extern "C"