Reputation: 123
Good afternoon! I need to run a program written in C++ that uses OpenCL. Before that I enabled OpenCL headers, installed CUDA (this is optional) and reinstalled Visual Studio and MinGW. I have an NVIDIA GeFOrce 1080.
Well, I have an array<int, 3> loc
and as a result of the execution loc
should change to 15, 15, 15 according to kernelFile2.cl(found is loc, check main code):
kernel void kernelFile(global int *faces, global int *facecount, global int *found, global int *xlength, global int *zlength, global int *ymin)
{
found[0] = 15;
found[1] = 15;
found[2] = 15;
}
I'm sorry, but I don't understand much about OpenCL, so I'll show you the whole program.
file.cpp:
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#include <iostream>
#include <fstream>
#include <CL/cl.hpp>
#include <array>
int main()
{
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
_ASSERT(platforms.size() > 0);
auto platform = platforms.front();
std::vector<cl::Device> devices;
platform.getDevices(CL_DEVICE_TYPE_GPU, &devices);
_ASSERT(devices.size() > 0);
auto device = devices.front();
std::cout << "Device: " << device.getInfo<CL_DEVICE_NAME>() << std::endl;
std::string fileName;
std::ifstream kernelFile("kernelFile2.cl");
std::string src(std::istreambuf_iterator<char>(kernelFile), (std::istreambuf_iterator<char>()));
cl::Program::Sources sources(1, std::make_pair(src.c_str(), src.length() + 1));
cl::Context context(device);
cl::Program program(context, sources);
auto err = program.build("-cl-std=CL1.2");
std::cout << std::to_string(err) << " error" <<std::endl;//print error code
int facecount = 1;
const int arraysize = 5;//5 times facecount
std::array<int, arraysize> formation = {{0, 0, 0, 1, 3,}};
std::array<int, 3> loc = {0, 0, 0} ;
int xlength = 10000;
int zlength = 10000;
int yrangesize = 1;
int ymin = 59;
cl::Buffer facesbuf(context, CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * arraysize, formation.data());
cl::Buffer facecountbuf(context, CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int), &facecount);
cl::Buffer resultbuf(context, CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * 3, loc.data());
cl::Buffer xlengthbuf(context, CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int), &xlength);
cl::Buffer zlengthbuf(context, CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int), &zlength);
cl::Buffer yminbuf(context, CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int), &ymin);
cl::Kernel kernel(program, "kernelFile");
kernel.setArg(0, facesbuf);
kernel.setArg(1, facecountbuf);
kernel.setArg(2, resultbuf);
kernel.setArg(3, xlengthbuf);
kernel.setArg(4, zlengthbuf);
kernel.setArg(5, yminbuf);
cl::CommandQueue queue(context, device);
std::cout << std::to_string(queue.enqueueNDRangeKernel(kernel, cl::NDRange(NULL), cl::NDRange(xlength, yrangesize, zlength))) << std::endl;
queue.enqueueReadBuffer(resultbuf, CL_TRUE, 0, sizeof(int) * 3, loc.data());
queue.finish();
std::cout << "X: " << loc[0] << " Y: " << loc[1] << " Z: " << loc[2];
}
But, unfortunately, this program does not change the variables.
It looked different in the beginning, but I changed it and left only what would help understand the problem.
Thank you so much if someone helps!
Upvotes: 1
Views: 221
Reputation: 5736
I tested the code and for me it works without issues. Must be a problem with the .cl file not loaded from the correct filepath or files not loaded into the VS project.
Upvotes: 1