Hello, I’m trying to write my first program in OpenC using C++ bindings, but I’m getting errors. Since it’s my first program and I don’t have much experience, I don’t know exactly if I’m doing things wrong or not. I’m getting "“Access violation reading location 0x00000000” on func().wait() call. Source code’s here:
#define __NO_STD_VECTOR
#define __NO_STD_STRING
#include <malloc.h>
#include <cl.hpp>
#include
using namespace std;
using namespace cl;
const char *kernelSrc = “__kernel void”
"vectorAdd(__global const int *a,"
"__global const int *b,"
"__global int *resultado)"
"{"
"// Vector element index"
"int nIndex = get_global_id(0);"
"resultado[nIndex] = a[nIndex] + b[nIndex];"
"}";
int main(void)
{
const int size = 4;
// get platform
vector platformList;
Platform::get(&platformList);
cout << "Platform number is: " << platformList.size() << endl;
// show platform info
cl::string platformInfo;
platformList[0].getInfo(CL_PLATFORM_VERSION, &platformInfo);
cout << "Platform Info: " << platformInfo.c_str() << endl;
// get available devices
vector devices;
platformList[0].getDevices(CL_DEVICE_TYPE_GPU, &devices);
cout << devices.size() << " device(s) found!" << endl;
// show device info
cl::string name;
devices[0].getInfo(CL_DEVICE_NAME, &name);
cout << "Device name: " << name.c_str() << endl;
// create OpenCL context
Context hContext(devices, 0, NULL, NULL, NULL);
// queue
CommandQueue queue(hContext, devices[0], 0, 0);
// Load source
cl::Program::Sources source(1, std::make_pair(kernelSrc,strlen(kernelSrc)));
// create and build program
Program program(hContext, source, NULL);
program.build(devices, NULL, NULL, NULL);
// Get the kernel so we can use it
Kernel kernel(program, “vectorAdd”, NULL);
// arrays on host
int *a = new int;
int *b = new int;
int *c = new int;
// initialize
a[0]=1; a[1]=2; a[2]=20; a[3]=8;
b[0]=29; a[1]=28; a[2]=10; a[3]=22;
// result should be {30, 30, 30, 30}
// Allocate memory on device and copy the arrays there
Buffer bufferA(hContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * size, a, NULL);
Buffer bufferB(hContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * size, b, NULL);
// Create buffer to get output on kernel
Buffer bufferResultado(hContext, CL_MEM_WRITE_ONLY, sizeof(int)*size, NULL, NULL);
// set arguments
kernel.setArg(0, bufferA);
kernel.setArg(1, bufferB);
kernel.setArg(2, bufferResultado);
// execute kernel
NDRange global(size);
NDRange local(2);
KernelFunctor func = kernel.bind(queue, global, local);
func().wait(); // error here…
…
cout << “Done!” << endl;
// copy from device to host
queue.enqueueReadBuffer(bufferResultado, CL_TRUE, 0, sizeof(int)*size, c, NULL, NULL);
for(int i=0; i<size; i++)
cout << c[i] << endl;
getchar();
return EXIT_SUCCESS;
}