summaryrefslogtreecommitdiff
path: root/external/clBLAS/src/library/tools/ktest/ktest.h
blob: 72daeafbb87210e59abe226581161be83afdeffc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* ************************************************************************
 * Copyright 2013 Advanced Micro Devices, Inc.
 *
 * 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.
 * ************************************************************************/


#ifndef KTEST_KTEST_H__
#define KTEST_KTEST_H__

#include <string>
#include <sstream>

#include "ktest-common.h"
#include "step.h"
#include "config.h"

namespace clMath {

/**
 * @internal
 * @brief Host code generation class
 *
 * Object of this class generate host-side source file that can execute kernels
 * for one or several steps.
 *
 */
class KTest {
private:
    std::string platform_;
    std::string device_;
    std::string kernelSourceFile_;
    std::string buildOptions_;
    KTestMatrixGenerator matrixGen_;
    Step *masterStep_;
    std::vector<Step*> *steps_;
    size_t indent_;
    bool useSeveralKernels_;

    const char* matrixGenName(KTestMatrixGenerator gen);
    const char* vectorGenName(KTestMatrixGenerator gen);

    void typedefs(std::stringstream& ss);
    void declareKTestOptions(std::stringstream& ss);
    void declareBlasOptions(std::stringstream& ss, Step *step);
    void declarePatternVars(std::stringstream& ss, Step *step);
    void generateMain(std::stringstream& ss, bool withAccuracy);

    void loadFile(std::stringstream& ss);

    void randomVector(std::stringstream& ss);
    void unitVector(std::stringstream& ss);
    void sawtoothVector(std::stringstream& ss);
    void compareVectors(std::stringstream& ss);

    void randomMatrix(std::stringstream& ss);
    void unitMatrix(std::stringstream& ss);
    void sawtoothMatrix(std::stringstream& ss);
    void setUpTRSMDiagonal(std::stringstream& ss);
    void compareMatrices(std::stringstream& ss);

    std::string indent();

    void includes(std::stringstream& ss);
    void forwardDeclarations(std::stringstream& ss);
    void declareGranulation(std::stringstream& ss, Step *step);
    void mainInit(std::stringstream& ss);
    void buildKernel(std::stringstream& ss);
    void allocateWriteBuffers(std::stringstream& ss);
    void setKernelArgs(std::stringstream& ss, Step *step);
    void execKernel(std::stringstream& ss);
    void readBuffers(std::stringstream& ss);
    void mainFinish(std::stringstream& ss);
    void auxFunctions(std::stringstream& ss);

    void getPlatform(std::stringstream& ss);
    void getDevice(std::stringstream& ss);
    void createKernel(std::stringstream& ss);
    void printExecTime(std::stringstream& ss);
    void getBufferSizeExpr(Variable *buffer, std::string& size);
public:
    KTest(Step *masterStep, clMath::Config *cfg);
    KTest(Step *masterStep, std::vector<clMath::Step*> *steps, clMath::Config *cfg);

    std::string generate(bool withAccuracy);
};

}   // namespace clMath

#endif  // KTEST_KTEST_H__