File: ocloc_wrapper.cpp

package info (click to toggle)
intel-compute-runtime 20.44.18297-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 34,780 kB
  • sloc: cpp: 379,729; lisp: 4,931; python: 299; sh: 196; makefile: 8
file content (88 lines) | stat: -rw-r--r-- 3,491 bytes parent folder | download | duplicates (2)
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
/*
 * Copyright (C) 2020 Intel Corporation
 *
 * SPDX-License-Identifier: MIT
 *
 */

#include "ocloc_wrapper.h"

#include "shared/source/os_interface/os_library.h"

#include <iostream>
#include <string>

typedef int (*pOclocInvoke)(
    unsigned int numArgs, const char *argv[],
    const uint32_t numSources, const uint8_t **dataSources, const uint64_t *lenSources, const char **nameSources,
    const uint32_t numInputHeaders, const uint8_t **dataInputHeaders, const uint64_t *lenInputHeaders, const char **nameInputHeaders,
    uint32_t *numOutputs, uint8_t ***dataOutputs, uint64_t **lenOutputs, char ***nameOutputs);

typedef int (*pOclocFreeOutput)(
    uint32_t *numOutputs, uint8_t ***dataOutputs, uint64_t **lenOutputs, char ***nameOutputs);

struct OclocLibrary {
    pOclocInvoke invoke = nullptr;
    pOclocFreeOutput freeOutput = nullptr;

    std::unique_ptr<NEO::OsLibrary> library;
    bool isLoaded() {
        return library != nullptr;
    }
};

OclocWrapper::OclocWrapper() : pImpl(std::make_unique<Impl>()){};
OclocWrapper::~OclocWrapper() = default;

struct OclocWrapper::Impl {
    OclocLibrary oclocLib;

    void loadOcloc() {
        OclocLibrary ocloc;
        std::string oclocLibName = OCLOC_LIB_NAME;
        ocloc.library.reset(NEO::OsLibrary::load(oclocLibName));
        if (nullptr == (ocloc.invoke = reinterpret_cast<pOclocInvoke>(ocloc.library->getProcAddress("oclocInvoke")))) {
            std::cout << "Error! Couldn't find OclocInvoke function.\n";
            return;
        }
        if (nullptr == (ocloc.freeOutput = reinterpret_cast<pOclocFreeOutput>(ocloc.library->getProcAddress("oclocFreeOutput")))) {
            std::cout << "Error! Couldn't find OclocFreeOutput function.\n";
            return;
        }
        this->oclocLib = std::move(ocloc);
    }
};

int OclocWrapper::invokeOcloc(unsigned int numArgs, const char *argv[]) {
    return invokeOcloc(numArgs, argv, 0, nullptr, nullptr, nullptr, 0, nullptr, nullptr, nullptr, nullptr,
                       nullptr, nullptr, nullptr);
}

int OclocWrapper::invokeOcloc(unsigned int numArgs, const char *argv[],
                              const uint32_t numSources, const uint8_t **dataSources, const uint64_t *lenSources, const char **nameSources,
                              const uint32_t numInputHeaders, const uint8_t **dataInputHeaders, const uint64_t *lenInputHeaders, const char **nameInputHeaders,
                              uint32_t *numOutputs, uint8_t ***dataOutputs, uint64_t **lenOutputs, char ***nameOutputs) {
    if (false == tryLoadOcloc()) {
        std::cout << "Error! Ocloc Library couldn't be loaded.\n";
        return -1;
    }
    return pImpl->oclocLib.invoke(numArgs, argv,
                                  numSources, dataSources, lenSources, nameSources,
                                  numInputHeaders, dataInputHeaders, lenInputHeaders, nameInputHeaders,
                                  numOutputs, dataOutputs, lenOutputs, nameOutputs);
}

int OclocWrapper::freeOutput(uint32_t *numOutputs, uint8_t ***dataOutputs, uint64_t **lenOutputs, char ***nameOutputs) {
    if (false == tryLoadOcloc()) {
        std::cout << "Error! Ocloc Library couldn't be loaded.\n";
        return -1;
    }
    return pImpl->oclocLib.freeOutput(numOutputs, dataOutputs, lenOutputs, nameOutputs);
}

bool OclocWrapper::tryLoadOcloc() {
    if (false == pImpl->oclocLib.isLoaded()) {
        pImpl->loadOcloc();
    }
    return pImpl->oclocLib.isLoaded();
}