blob: b119a7513496bd1866ecaf612e27b274ef330a1e [file]
#define __CL_ENABLE_EXCEPTIONS
//#define __NO_STD_STRING
#define _VARIADIC_MAX 10
#include <CL/cl.hpp>
#include <iostream>
#include <vector>
const int numElements = 32;
int main(void)
{
cl::Program addProgram(
std::string(
"int add(int a, int b) { return a + b; }")
, false);
cl::Program vectorWrapper(
std::string(
"int add(int a, int b); kernel void vectorAdd(global const int *inputA, global const int *inputB, global int *output){output[get_global_id(0)] = add(inputA[get_global_id(0)], inputB[get_global_id(0)]);}")
, false);
std::vector<cl::Program> programs;
addProgram.compile();
vectorWrapper.compile();
programs.push_back(addProgram);
programs.push_back(vectorWrapper);
cl::Program vectorAddProgram = cl::linkProgram(programs);
auto vectorAddKernel =
cl::make_kernel<
cl::Buffer&,
cl::Buffer&,
cl::Buffer&
>( vectorAddProgram, "vectorAdd" );
std::vector<int> inputA(numElements, 1);
std::vector<int> inputB(numElements, 2);
std::vector<int> output(numElements, 0xdeadbeef);
cl::Buffer inputABuffer(begin(inputA), end(inputA), true);
cl::Buffer inputBBuffer(begin(inputB), end(inputB), true);
cl::Buffer outputBuffer(begin(output), end(output), false);
vectorAddKernel(
cl::EnqueueArgs(
cl::NDRange(numElements),
cl::NDRange(numElements)),
inputABuffer,
inputBBuffer,
outputBuffer);
cl::copy(outputBuffer, begin(output), end(output));
std::cout << "Output:\n";
for( int i = 1; i < numElements; ++i ) {
std::cout << "\t" << output[i] << "\n";
}
std::cout << "\n\n";
}