summaryrefslogtreecommitdiff
path: root/external/clBLAS/src/library/tools/ktest/ktest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'external/clBLAS/src/library/tools/ktest/ktest.cpp')
-rw-r--r--external/clBLAS/src/library/tools/ktest/ktest.cpp708
1 files changed, 0 insertions, 708 deletions
diff --git a/external/clBLAS/src/library/tools/ktest/ktest.cpp b/external/clBLAS/src/library/tools/ktest/ktest.cpp
deleted file mode 100644
index 6f668db2..00000000
--- a/external/clBLAS/src/library/tools/ktest/ktest.cpp
+++ /dev/null
@@ -1,708 +0,0 @@
-/* ************************************************************************
- * 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.
- * ************************************************************************/
-
-
-#include <blas_funcs.h>
-#include "var.h"
-#include "ktest.h"
-#include "ktest-patterns.h"
-
-using namespace clMath;
-
-KTest::KTest(Step *step, clMath::Config *cfg) :
- platform_(cfg->platform()), device_(cfg->device()),
- kernelSourceFile_(cfg->cl()), buildOptions_(cfg->buildOptions()),
- matrixGen_(cfg->dataPattern()),
- masterStep_(step), indent_(0), useSeveralKernels_(false)
-{
-}
-
-KTest::KTest(Step *masterStep, std::vector<Step*> *steps, clMath::Config *cfg) :
- platform_(cfg->platform()), device_(cfg->device()),
- kernelSourceFile_(cfg->cl()), buildOptions_(cfg->buildOptions()),
- matrixGen_(cfg->dataPattern()),
- masterStep_(masterStep), steps_(steps), indent_(0), useSeveralKernels_(true)
-{
-}
-
-std::string
-KTest::indent()
-{
- std::string str = "";
-
- for (size_t i = 0; i < indent_; i++) {
- str += " ";
- }
- return str;
-}
-
-const char*
-KTest::matrixGenName(KTestMatrixGenerator gen)
-{
- switch (gen) {
- case RANDOM_MATRIX:
- return "randomMatrix";
- case UNIT_MATRIX:
- return "unitMatrix";
- case SAWTOOTH_MATRIX:
- return "sawtoothMatrix";
- default:
- return NULL;
- }
-}
-
-const char*
-KTest::vectorGenName(KTestMatrixGenerator gen)
-{
- switch (gen) {
- case RANDOM_MATRIX:
- return "randomVector";
- case UNIT_MATRIX:
- return "unitVector";
- case SAWTOOTH_MATRIX:
- return "sawtoothVector";
- default:
- return NULL;
- }
-}
-
-std::string
-KTest::generate(bool withAccuracy)
-{
- std::stringstream ss;
- int level;
-
- ss << indent() << "#define _CRT_SECURE_NO_WARNINGS" << std::endl;
-
- ss << std::endl
- << indent() << "#include <assert.h>" << std::endl
- << indent() << "#include <math.h>" << std::endl
- << indent() << "#include <stdio.h>" << std::endl
- << indent() << "#include <stdlib.h>" << std::endl
- << indent() << "#include <string.h>" << std::endl
- << indent() << "#include <time.h>" << std::endl
- << indent() << "#include <string>" << std::endl;
- if (masterStep_->blasFunctionID() == CLBLAS_TRSM) {
- ss << indent() << "#include <math.h>" << std::endl
- << indent() << "#define NANF NAN" << std::endl;
- }
-
- includes(ss);
- ss << std::endl
- << indent() << "#include \"naive_blas.cpp\"" << std::endl
- << std::endl
- << indent() << "using namespace NaiveBlas;" << std::endl;
-
- if (masterStep_->blasFunctionID() == CLBLAS_TRSM) {
- setUpTRSMDiagonal(ss);
- }
-
- level = funcBlasLevel(masterStep_->blasFunctionID());
-
- switch (matrixGen_) {
- case RANDOM_MATRIX:
- if (level == 2) {
- randomVector(ss);
- }
- randomMatrix(ss);
- break;
- case UNIT_MATRIX:
- if (level == 2) {
- unitVector(ss);
- }
- unitMatrix(ss);
- break;
- case SAWTOOTH_MATRIX:
- if (level == 2) {
- sawtoothVector(ss);
- }
- sawtoothMatrix(ss);
- break;
- default:
- break;
- }
-
- if (withAccuracy) {
- if (level == 2) {
- compareVectors(ss);
- }
- else {
- compareMatrices(ss);
- }
- }
-
- declareKTestOptions(ss);
- declareBlasOptions(ss, masterStep_);
- declarePatternVars(ss, masterStep_);
-
- ss << std::endl
- << indent() << "char* loadFile(const char* path);" << std::endl;
- forwardDeclarations(ss);
-
- generateMain(ss, withAccuracy);
-
- loadFile(ss);
- auxFunctions(ss);
-
- return ss.str();
-}
-
-void
-KTest::declareKTestOptions(std::stringstream& ss)
-{
- ss << std::endl;
-
- ss << indent() << "const char PLATFORM_NAME[] = \""
- << platform_ << "\";" << std::endl;
- ss << indent() << "const char DEVICE_NAME[] = \""
- << device_ << "\";" << std::endl;
- ss << indent() << "const char BUILD_OPTIONS[] = \""
- << buildOptions_ << "\";" << std::endl;
- ss << indent() << "const char KERNEL_SOURCE[] = \""
- << kernelSourceFile_ << "\";" << std::endl;
-}
-
-void
-KTest::declareBlasOptions(std::stringstream& ss, Step *step)
-{
- ss << std::endl;
- ss << indent() << "const clblasOrder order = "
- << ((step->kargs().order == clblasColumnMajor)
- ? "clblasColumnMajor"
- : "clblasRowMajor")
- << ";" << std::endl;
- ss << indent() << "const clblasSide side = "
- << ((step->kargs().side == clblasRight)
- ? "clblasRight"
- : "clblasLeft")
- << ";" << std::endl;
- ss << indent() << "const clblasUplo uplo = "
- << ((step->kargs().uplo == clblasUpper)
- ? "clblasUpper"
- : "clblasLower")
- << ";" << std::endl;
- ss << indent() << "const clblasTranspose transA = ";
- switch (step->kargs().transA) {
- case clblasNoTrans:
- ss << "clblasNoTrans";
- break;
- case clblasTrans:
- ss << "clblasTrans";
- break;
- case clblasConjTrans:
- ss << "clblasConjTrans";
- break;
- }
- ss << ";" << std::endl;
- ss << indent() << "const clblasTranspose transB = ";
- switch (step->kargs().transB) {
- case clblasNoTrans:
- ss << "clblasNoTrans";
- break;
- case clblasTrans:
- ss << "clblasTrans";
- break;
- case clblasConjTrans:
- ss << "clblasConjTrans";
- break;
- }
- ss << ";" << std::endl;
- ss << indent() << "const clblasDiag diag = "
- << ((step->kargs().diag == clblasUnit)
- ? "clblasUnit"
- : "clblasNonUnit")
- << ";" << std::endl;
-}
-
-void
-KTest::declarePatternVars(std::stringstream& ss, Step *step)
-{
- VarList vars = step->vars();
- ArrayVarList var_arays = step->arrays();
-
- vars.insert(vars.end(), var_arays.begin(), var_arays.end());
-
- ss << std::endl;
- for (VarList::const_iterator it = vars.begin(); it != vars.end(); ++it) {
- Variable *var = *it;
- if (step != masterStep_ && var->isBuffer()) {
- // master step buffers are used
- continue;
- }
- ss << indent();
- if (var->constant()) {
- ss << "const ";
- }
- ss << var->type() << " " << var->name();
- if (!var->defaultValue().empty()) {
- ss << " = " << var->defaultValue();
- }
- ss << ";" << std::endl;
- }
-}
-
-void
-KTest::generateMain(std::stringstream& ss, bool withAccuracy)
-{
- ArrayVarList list;
- std::map<unsigned int, const Variable*> kargMap = masterStep_->kargMap();
- std::string size;
-
- ss << std::endl;
- ss << indent() << "int" << std::endl;
- if (useSeveralKernels_) {
- ss << indent() << "main(int argc, char *argv[])" << std::endl;
- }
- else {
- ss << indent() << "main(void)" << std::endl;
- }
-
- ss << indent() << "{" << std::endl;
- indent_ += 4;
-
- ss << std::endl
- << indent() << "char *source;" << std::endl
- << indent() << "cl_ulong start, end;" << std::endl;
-
- ss << std::endl
- << indent() << "srand((unsigned int)time(NULL));" << std::endl;
-
- mainInit(ss);
-
- ss << std::endl;
- list = masterStep_->arrays();
- for (ArrayVarList::const_iterator it = list.begin(); it != list.end(); ++it) {
- ss << indent() << (*it)->name() << " = (" <<(*it)->type() << ")calloc(";
- if ((*it)->isMatrix()) {
- ss << masterStep_->matrixSize((MatrixVariable*)(*it));
- }
- else {
- ss << masterStep_->vectorSize((VectorVariable*)(*it));
- }
- ss << ", "
- << "sizeof(*" << (*it)->name() << "));" << std::endl;
- ss << indent() << "assert(" << (*it)->name() << " != NULL);" << std::endl;
- if ((*it)->copyOf() != NULL) {
- continue;
- }
- if ((*it)->isMatrix()) {
- MatrixVariable *var = (MatrixVariable*)(*it);
-
- ss << indent() << matrixGenName(matrixGen_) << "(order, "
- << var->rows()->name() << ", "
- << var->columns()->name() << ", " << var->matrixPointer() << ", "
- << var->ld()->name() << ");" << std::endl;
- }
- else {
- VectorVariable *var = (VectorVariable*)(*it);
- ss << indent() << vectorGenName(matrixGen_) << "("
- << var->nElems()->name() << ", "
- << var->vectorPointer() << ", " << var->inc()->name()
- << ");" << std::endl;
- }
- }
-
- ss << indent() << masterStep_->postRandomCall() << ";" << std::endl;
-
- for (ArrayVarList::const_iterator it = list.begin(); it != list.end(); ++it) {
- if ((*it)->copyOf() == NULL) {
- continue;
- }
- ss << indent() << "memcpy(" << (*it)->name() << ", "
- << (*it)->copyOf()->name() << ", (";
- if ((*it)->isMatrix()) {
- ss << masterStep_->matrixSize((MatrixVariable*)(*it));
- }
- else {
- ss << masterStep_->vectorSize((VectorVariable*)(*it));
- }
- ss << ") * sizeof(*" << (*it)->copyOf()->name() << "));" << std::endl;
- }
-
- if (withAccuracy) {
- ss << std::endl
- << indent() << "NaiveBlas::" << masterStep_->naiveCall() << ";"
- << std::endl;
- }
-
- allocateWriteBuffers(ss);
-
- if (useSeveralKernels_) {
- for (unsigned int i = 0; i < steps_->size(); i++) {
- Step *step = (*steps_)[i];
- ss << indent() << "{" << std::endl;
- indent_ += 4;
-
- declareGranulation(ss, step);
-
- ss << indent() << "const char* kernelName = argc > " << i + 1
- << " ? argv[" << i + 1 << "] : \""
- << step->kernelName() << "\";" << std::endl;
-
- ss << std::endl
- << indent() << "source = loadFile(kernelName);" << std::endl
- << indent() << "assert(source != NULL);" << std::endl;
- buildKernel(ss);
-
- declareBlasOptions(ss, step);
- declarePatternVars(ss, step);
- setKernelArgs(ss, step);
-
-
- ss << std::endl
- << indent() << "start = 0;" << std::endl
- << indent() << "end = 0;" << std::endl;
- execKernel(ss);
- ss << std::endl
- << indent() << "printExecTime(end - start);" << std::endl;
-
- indent_ -= 4;
- ss << indent() << "}" << std::endl;
- }
- }
- else {
- declareGranulation(ss, masterStep_);
- ss << std::endl
- << indent() << "source = loadFile(KERNEL_SOURCE);" << std::endl
- << indent() << "assert(source != NULL);" << std::endl;
- buildKernel(ss);
-
- setKernelArgs(ss, masterStep_);
-
- ss << std::endl
- << indent() << "start = 0;" << std::endl
- << indent() << "end = 0;" << std::endl;
- execKernel(ss);
- ss << std::endl
- << indent() << "printExecTime(end - start);" << std::endl;
- }
- if (withAccuracy) {
- readBuffers(ss);
-
- ss << std::endl
- << indent() << "if (" << masterStep_->compareCall() << ") {"
- << std::endl << indent()
- << " printf(\"Correctness test passed\\n\");" << std::endl
- << indent() << "}" << std::endl
- << indent() << "else {" << std::endl
- << indent() << " printf(\"Correctness test failed\\n\");"
- << std::endl
- << indent() << "}" << std::endl
- << indent() << "fflush(stdout);" << std::endl;
- }
-
- mainFinish(ss);
-
- ss << std::endl;
- list = masterStep_->arrays();
- for (ArrayVarList::const_iterator it = list.begin(); it != list.end(); ++it) {
- ss << indent() << "free(" << (*it)->name() << ");" << std::endl;
- }
- ss << indent() << "free(source);" << std::endl
- << indent() << "exit(EXIT_SUCCESS);" << std::endl;
-
- indent_ -= 4;
- ss << indent() << "}" << std::endl;
-}
-
-void
-KTest::loadFile(std::stringstream& ss)
-{
- ss << loadFileCode << std::endl;
-}
-
-void
-KTest::randomVector(std::stringstream& ss)
-{
- ss << randomVectorCode << std::endl;
-}
-
-void
-KTest::unitVector(std::stringstream& ss)
-{
- ss << unitVectorCode << std::endl;
-}
-
-void
-KTest::sawtoothVector(std::stringstream& ss)
-{
- ss << sawtoothVectorCode << std::endl;
-}
-
-void
-KTest::compareVectors(std::stringstream& ss)
-{
- ss << compareVectorsCode << std::endl;
-}
-
-void
-KTest::randomMatrix(std::stringstream& ss)
-{
- ss << randomMatrixCode << std::endl;
-}
-
-void
-KTest::unitMatrix(std::stringstream& ss)
-{
- ss << unitMatrixCode << std::endl;
-}
-
-void
-KTest::sawtoothMatrix(std::stringstream& ss)
-{
- ss << sawtoothMatrixCode << std::endl;
-}
-
-void
-KTest::setUpTRSMDiagonal(std::stringstream& ss)
-{
- ss << setUpTRSMDiagonalCode << std::endl;
-}
-
-void
-KTest::compareMatrices(std::stringstream& ss)
-{
- ss << compareMatricesCode << std::endl;
-}
-
-
-
-void
-KTest::includes(std::stringstream& ss)
-{
- ss << std::endl
- << indent() << "#include <CL/cl.h>" << std::endl;
-}
-
-void
-KTest::forwardDeclarations(std::stringstream& ss)
-{
- ss << forwardDeclarationsCode << std::endl;
-}
-
-void
-KTest::auxFunctions(std::stringstream& ss)
-{
- getPlatform(ss);
- getDevice(ss);
- createKernel(ss);
- printExecTime(ss);
-}
-
-void
-KTest::getPlatform(std::stringstream& ss)
-{
- ss << getPlatformCode << std::endl;
-}
-
-void
-KTest::getDevice(std::stringstream& ss)
-{
- ss << getDeviceCode << std::endl;
-}
-
-void
-KTest::createKernel(std::stringstream& ss)
-{
- ss << createKernelCode << std::endl;
-}
-
-void
-KTest::printExecTime(std::stringstream& ss)
-{
- ss << printTimeCode;
-}
-
-void
-KTest::declareGranulation(std::stringstream& ss, Step *step)
-{
- ss << std::endl;
- ss << indent() << "const cl_uint workDim = "
- << step->pgran().wgDim << ";" << std::endl;
- ss << indent() << "const size_t localWorkSize["
- << step->pgran().wgDim
- << "] = { ";
- for (unsigned int i = 0; i < step->pgran().wgDim; i++) {
- if (i != 0) {
- ss << ", ";
- }
- ss << step->pgran().wgSize[i];
- }
- ss << " };" << std::endl;
- ss << indent() << "const size_t globalWorkSize["
- << step->pgran().wgDim
- << "] = { " << step->globalWorkSize() << " };" << std::endl;
-}
-
-void
-KTest::mainInit(std::stringstream& ss)
-{
- ss << std::endl
- << indent() << "cl_int err;" << std::endl
- << indent() << "cl_platform_id platform;" << std::endl
- << indent() << "cl_device_id device;" << std::endl
- << indent() << "cl_context_properties props[3] = { CL_CONTEXT_PLATFORM, 0, 0 };" << std::endl
- << indent() << "cl_context context;" << std::endl
- << indent() << "cl_command_queue queue;" << std::endl
- << indent() << "cl_kernel kernel;" << std::endl
- << indent() << "cl_event event;" << std::endl;
-
- ss << std::endl
- << indent() << "platform = getPlatform(PLATFORM_NAME);" << std::endl
- << indent() << "assert(platform != NULL);" << std::endl
- << indent() << "device = getDevice(platform, DEVICE_NAME);" << std::endl
- << indent() << "assert(device != NULL);" << std::endl
- << indent() << "props[1] = (cl_context_properties)platform;" << std::endl
- << indent() << "context = clCreateContext(props, 1, &device, NULL, NULL, &err);" << std::endl
- << indent() << "assert(context != NULL);" << std::endl
- << indent() << "queue = clCreateCommandQueue(context, device, CL_QUEUE_PROFILING_ENABLE, &err);" << std::endl
- << indent() << "assert(queue != NULL);" << std::endl;
-}
-
-void
-KTest::buildKernel(std::stringstream& ss)
-{
- ss << indent() << "kernel = createKernel(source, context, BUILD_OPTIONS, &err);" << std::endl
- << indent() << "assert(kernel != NULL);" << std::endl;
-}
-
-void
-KTest::getBufferSizeExpr(Variable *buffer, std::string& size)
-{
- ArrayVariableInterface *hostPtr = (ArrayVariableInterface*)(buffer->hostPtr());
- if (hostPtr->isMatrix()) {
- MatrixVariable *ptrVar = (MatrixVariable*)hostPtr;
- if (masterStep_->matrixSize(ptrVar).empty()) {
- size += "sizeof(";
- size += ptrVar->type();
- size += ")";
- }
- else {
- size = "(";
- size += masterStep_->matrixSize(ptrVar);
- size += ") * sizeof(*";
- size += ptrVar->name();
- size += ")";
- }
- }
- else {
- VectorVariable *ptrVar = (VectorVariable*)buffer->hostPtr();
- size = "(";
- size += masterStep_->vectorSize(ptrVar);
- size += ") * sizeof(*";
- size += ptrVar->name();
- size += ")";
- }
-}
-
-void
-KTest::allocateWriteBuffers(std::stringstream& ss)
-{
- VarList list;
- std::string size;
-
- ss << std::endl;
- list = masterStep_->buffers();
- for (VarList::const_iterator it = list.begin(); it != list.end(); ++it) {
- getBufferSizeExpr(*it, size);
- ss << indent() << (*it)->name() << " = clCreateBuffer(context, "
- << (*it)->flagsStr() << "," << std::endl
- << indent() << " " << size << ", NULL, &err);" << std::endl;
- ss << indent() << "assert(" << (*it)->name() << " != NULL);" << std::endl;
- if (((*it)->flags() & CL_MEM_READ_WRITE) ||
- ((*it)->flags() & CL_MEM_READ_ONLY)) {
- ss << indent() << "err = clEnqueueWriteBuffer(queue, "
- << (*it)->name() << ", CL_TRUE, 0," << std::endl
- << indent() << " " << size << ", "
- << ((Variable*)(*it)->hostPtr())->name() << "," << std::endl
- << indent() << " 0, NULL, NULL);" << std::endl;
- ss << indent() << "assert(err == CL_SUCCESS);" << std::endl;
- }
- }
-}
-
-void
-KTest::setKernelArgs(std::stringstream& ss, Step *step)
-{
- std::map<unsigned int, const Variable*> kargMap = step->kargMap();
- ss << std::endl;
- for (KArgMap::iterator it = kargMap.begin(); it != kargMap.end(); ++it) {
- ss << indent() << "err = clSetKernelArg(kernel, "
- << (*it).first << ", sizeof(" << (*it).second->type() << "), "
- << "&" << (*it).second->name() << ");" << std::endl;
- ss << indent() << "assert(err == CL_SUCCESS);" << std::endl;
- }
-}
-
-void
-KTest::execKernel(std::stringstream& ss)
-{
- ss << std::endl
- << indent() << "event = NULL;" << std::endl
- << indent() << "err = clEnqueueNDRangeKernel(queue, kernel, workDim, NULL," << std::endl
- << indent() << " globalWorkSize, localWorkSize, 0, NULL, &event);" << std::endl
- << indent() << "assert(err == CL_SUCCESS);" << std::endl
- << indent() << "err = clFinish(queue);" << std::endl
- << indent() << "assert(err == CL_SUCCESS);" << std::endl;
-
- ss << std::endl
- << indent() << "err = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START," << std::endl
- << indent() << " sizeof(start), &start, NULL);" << std::endl
- << indent() << "err = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END," << std::endl
- << indent() << " sizeof(end), &end, NULL);" << std::endl;
-}
-
-void
-KTest::readBuffers(std::stringstream& ss)
-{
- VarList list;
- std::string size;
-
- ss << std::endl;
- list = masterStep_->buffers();
- for (VarList::const_iterator it = list.begin(); it != list.end(); ++it) {
- if (((*it)->flags() & CL_MEM_READ_WRITE) ||
- ((*it)->flags() & CL_MEM_WRITE_ONLY)) {
- getBufferSizeExpr(*it, size);
- ss << indent() << "err = clEnqueueReadBuffer(queue, "
- << (*it)->name() << ", CL_TRUE, 0," << std::endl
- << indent() << " " << size << ", "
- << ((Variable*)(*it)->hostPtr())->name() << "," << std::endl
- << indent() << " 0, NULL, NULL);" << std::endl;
- ss << indent() << "assert(err == CL_SUCCESS);" << std::endl;
- }
- }
-}
-
-void
-KTest::mainFinish(std::stringstream& ss)
-{
- VarList list;
-
- ss << std::endl;
- list = masterStep_->buffers();
- for (VarList::const_iterator it = list.begin(); it != list.end(); ++it) {
- ss << indent() << "err = clReleaseMemObject("
- << (*it)->name() << ");" << std::endl;
- ss << indent() << "assert(err == CL_SUCCESS);" << std::endl;
- }
- ss << indent() << "err = clReleaseKernel(kernel);" << std::endl
- << indent() << "assert(err == CL_SUCCESS);" << std::endl
- << indent() << "err = clReleaseCommandQueue(queue);" << std::endl
- << indent() << "assert(err == CL_SUCCESS);" << std::endl
- << indent() << "err = clReleaseContext(context);" << std::endl
- << indent() << "assert(err == CL_SUCCESS);" << std::endl;
-}