1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_BENCH_H
18#define ANDROID_BENCH_H
19
20#include <pthread.h>
21
22#include "WorkerPool.h"
23
24#include <string.h>
25
26
27
28class Bench {
29public:
30    Bench();
31    ~Bench();
32
33    struct GFlop {
34        int kernelXSize;
35        //int kernelYSize;
36        int imageXSize;
37        //int imageYSize;
38
39        float *srcBuffer;
40        float *kernelBuffer;
41        float *dstBuffer;
42
43
44    };
45    GFlop mGFlop;
46
47    bool init();
48
49    bool runPowerManagementTest(uint64_t options);
50    bool runCPUHeatSoak(uint64_t options);
51
52    bool startMemTests();
53    void endMemTests();
54    float runMemoryBandwidthTest(uint64_t options);
55    float runMemoryLatencyTest(uint64_t options);
56
57    float runGFlopsTest(uint64_t options);
58
59    void getData(float *data, size_t count) const;
60
61
62    void finish();
63
64    void setPriority(int32_t p);
65    void destroyWorkerThreadResources();
66
67    uint64_t getTimeNanos() const;
68    uint64_t getTimeMillis() const;
69
70    // Adds a work unit completed to the timeline and returns
71    // true if the test is ongoing, false if time is up
72    bool incTimeBucket() const;
73
74
75protected:
76    WorkerPool mWorkers;
77
78    bool mExit;
79    bool mPaused;
80
81    static void testWork(void *usr, uint32_t idx);
82
83private:
84    uint8_t * volatile mMemSrc;
85    uint8_t * volatile mMemDst;
86    size_t mMemLoopCount;
87    size_t mMemLatencyLastSize;
88
89
90    float ** mIpKernel;
91    float * volatile * mSrcBuf;
92    float * volatile * mOutBuf;
93    uint32_t * mTimeBucket;
94
95    uint64_t mTimeStartNanos;
96    uint64_t mTimeEndNanos;
97    uint64_t mTimeBucketDivisor;
98    uint32_t mTimeBuckets;
99
100    uint64_t mTimeEndGroupNanos;
101
102    bool initIP();
103    void GflopKernelC();
104    void GflopKernelC_y3();
105
106    bool allocateBuckets(size_t);
107
108
109};
110
111
112#endif
113