我试图在OpenCL中运行矢量加法代码,我一直得到clCreateKernel:-46错误。构建程序没有返回错误。
下面的 vector_add_kernel.cl 文件。
__kernel void vecadd(__global int *A, __global int *B, __global int *C)
{
int idx = get_global_id(0);
C[idx] = A[idx] + B[idx];
}
这是矢量加法内核和代码。我正在努力细化为什么我得到了错误的原因.我能够在C中编译,但未能在C++包装器中工作的代码.我试图在OpenCL中运行矢量加法代码,我一直得到clCreateKernel:-46错误。
#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
int main(){
const int elements = 2048;
size_t datasize = sizeof(int) * elements;
int *A = (int*)malloc(datasize);
int *B = (int*)malloc(datasize);
int *C = (int*)malloc(datasize);
//Initialize the input data
int i;
for (i = 0; i < elements; i++){
A[i] = i;
B[i] = i;
}
try{
std::vector <cl::Platform> platforms;
cl::Platform::get(&platforms);
auto platform = platforms.back();
std::vector <cl::Device> devices;
platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &devices);
cl::Context context(devices);
cl::CommandQueue queue = cl::CommandQueue(context, devices[0]);
cl::Buffer bufferA = cl::Buffer(context, CL_MEM_READ_ONLY, datasize);
cl::Buffer bufferB = cl::Buffer(context, CL_MEM_READ_ONLY, datasize);
cl::Buffer bufferC = cl::Buffer(context, CL_MEM_WRITE_ONLY, datasize);
queue.enqueueWriteBuffer(bufferA, CL_TRUE, 0, datasize, A);
queue.enqueueWriteBuffer(bufferB, CL_TRUE, 0, datasize, B);
std::ifstream sourceFile("vecadd.cl");
std::string sourceCode(std::istreambuf_iterator <char>(sourceFile),
(std::istreambuf_iterator <char>()));
cl::Program::Sources source(1, std::make_pair(sourceCode.c_str(), sourceCode.length() + 1));
cl::Program program = cl::Program(context, source);
program.build(devices);
cl::Kernel vecadd_kernel(program, "vecadd");
vecadd_kernel.setArg(0, bufferA);
vecadd_kernel.setArg(1, bufferB);
vecadd_kernel.setArg(2, bufferC);
cl::NDRange global(elements);
cl::NDRange local(256);
queue.enqueueNDRangeKernel(vecadd_kernel, cl::NullRange, global, local);
queue.enqueueReadBuffer(bufferC, CL_TRUE, 0, datasize, C);
}
catch(cl::Error error){
std::cout << error.what() << "(" << error.err() << ")" << std::endl;
}
return 0;
}
在.cpp文件中,你声明内核名称是 vector_add_kernel1
:
cl::Kernel vecadd_kernel(program, "vector_add_kernel1");
^^^^^^^^^^^^^^^^^^^^
但在 vector_add_kernel.cl
内核文件名是 vecadd
:
__kernel void vecadd(__global int *A, __global int *B, __global int *C)
^^^^^^
修改.cpp文件中的内核名称,使其与.cpp文件中的名称一致。vector_add_kernel.cl
:
cl::Kernel vecadd_kernel(program, "vecadd");
^^^^^^^^