向量加法代码 OpenCL返回clCreateKernel错误-46。

问题描述 投票:0回答:1

我试图在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;

}
c++ opencl
1个回答
1
投票

在.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");
                                  ^^^^^^^^
© www.soinside.com 2019 - 2024. All rights reserved.