Skip to content

Latest commit

 

History

History
144 lines (122 loc) · 5.41 KB

C_API.md

File metadata and controls

144 lines (122 loc) · 5.41 KB

Clspv - C API wrapper

There is a C API for shared lib version of Clspv.

This C API allows for compiling OpenCL C as well as linking IR generated by Clspv.

User will need to enable CMake option to enable building Clspv as a shared lib:

$ cmake -DCLSPV_SHARED_LIB=ON ...

clBuildProgram Example Flow

#include <cstdio>
#include <cstdint>

#include "clspv/Compiler.h"

int main() {
    // CL source example:
    const char* clSrc = "__kernel void sample_test(__global int *dst, int count) {  \n"
                        "                                                           \n"
                        "   int  tid = get_global_id(0);                            \n"
                        "   for( int i = 0; i < count; i++ )                        \n"
                        "       dst[i] = tid + i;                                   \n"
                        "}                                                          \n";

    // Compile
    size_t outputSpvSize = 0;
    char* outputSpv = nullptr;
    char* outputBuildLog = nullptr;
    ClspvError ret = clspvCompileFromSourcesString(1,
                                                   NULL,
                                                   (const char**)&clSrc,
                                                   "",
                                                   &outputSpv,
                                                   &outputSpvSize,
                                                   &outputBuildLog);
    printf("Build Log:\n%s\n", outputBuildLog);
    if (ret != CLSPV_SUCCESS) {
        // Handle error ...
    }

    // Cleanup
    clspvFreeOutputBuildObjs(outputSpv, outputBuildLog);
    /*
        // User can also cleanup like so:

        free(outputSpv);       outputSpv       = NULL;
        free(outputBuildLog);  outputBuildLog  = NULL;
    */

    return 0;
}

clCompileProgram and clLinkProgram Example Flow

#include <cstdio>
#include <cstdint>

#include "clspv/Compiler.h"

int main() {
    // Test/Build CL source example:
    const char* clSrc = "__kernel void sample_test(__global int *dst, int count) {  \n"
                        "                                                           \n"
                        "   int  tid = get_global_id(0);                            \n"
                        "   for( int i = 0; i < count; i++ )                        \n"
                        "       dst[i] = tid + i;                                   \n"
                        "}                                                          \n";

    const char* clSrc2 = "__kernel void sample_test2(__global float *src, __global int *dst) {  \n"
                         "    int  tid = get_global_id(0);                                      \n"
                         "    dst[tid] = (int)src[tid];                                         \n"
                         "}                                                                     \n";

    // Compile first program to LLVM IR
    size_t outputBinSize = 0;
    char* outputBin = nullptr;
    char* outputBuildLog = nullptr;
    ClspvError ret = clspvCompileFromSourcesString(1,
                                                   NULL,
                                                   (const char**)&clSrc,
                                                   "--output-format=bc ",
                                                   &outputBin,
                                                   &outputBinSize,
                                                   &outputBuildLog);
    if (ret != CLSPV_SUCCESS) {
        // Handle error ...
    }

    // Compile second program to LLVM IR
    size_t outputBinSize2 = 0;
    char* outputBin2 = nullptr;
    char* outputBuildLog2 = nullptr;
    ret = clspvCompileFromSourcesString(1,
                                        NULL,
                                        (const char**)&clSrc2,
                                        "--output-format=bc ",
                                        &outputBin2,
                                        &outputBinSize2,
                                        &outputBuildLog2);
    if (ret != CLSPV_SUCCESS) {
        // Handle error ...
    }

    // Link programs
    size_t outputSpvSize = 0;
    char* outputSpv = nullptr;
    size_t outputBinSizes[2] = { outputBinSize, outputBinSize2 };
    const char* outputBinChars[2] = { outputBin, outputBin2 };
    char* outputBuildLog3 = nullptr;
    ret = clspvCompileFromSourcesString(2,
                                        outputBinSizes,
                                        outputBinChars,
                                        "-x ir ",
                                        &outputSpv,
                                        &outputSpvSize,
                                        &outputBuildLog3);
    if (ret != CLSPV_SUCCESS) {
        // Handle error ...
    }

    // Cleanup
    clspvFreeOutputBuildObjs(outputBin,  outputBuildLog);
    clspvFreeOutputBuildObjs(outputBin2, outputBuildLog2);
    clspvFreeOutputBuildObjs(outputSpv,  outputBuildLog3);
    /*
        // User can also cleanup like so:

        free(outputBin);       outputBin       = NULL;
        free(outputBuildLog);  outputBuildLog  = NULL;
        free(outputBin2);      outputBin2      = NULL;
        free(outputBuildLog2); outputBuildLog2 = NULL;
        free(outputSpv);       outputSpv       = NULL;
        free(outputBuildLog3); outputBuildLog3 = NULL;
    */

    return 0;
}