什么可能导致OpenCL在cl::Program.build上崩溃?

什么可能导致OpenCL在cl::Program.build上崩溃?,opencl,Opencl,当我尝试cl::program.build()时,这个程序崩溃了,但我不知道为什么。它在这段代码的最后一行崩溃: #define __NO_STD_VECTOR #define __CL_ENABLE_EXCEPTIONS #include <CL/cl.hPP> #include <iostream> #include <fstream> #include <string> #include <CL/cl.h> using nam

当我尝试cl::program.build()时,这个程序崩溃了,但我不知道为什么。它在这段代码的最后一行崩溃:

#define __NO_STD_VECTOR 
#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hPP>
#include <iostream>
#include <fstream>
#include <string>
#include <CL/cl.h>

using namespace std;
using namespace cl;
int _tmain(int argc, _TCHAR* argv[])
{
    int tmpSize = 1024;
    float **my2D = new float*[tmpSize];
    for(int i = 0; i < tmpSize; i++)
    {
        my2D[i] = new float[tmpSize];
        for(int i2 = 0; i2 < tmpSize; i2++)
        {
            my2D[i][i2] = 5;
        }
    }
    cl::vector <Platform> platforms;
    Platform::get(&platforms);

    cl_context_properties cps[3] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[1]()), 0};
    Context context(CL_DEVICE_TYPE_ALL, cps);

    cl::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();

    CommandQueue queue = CommandQueue(context, devices[0], 0);

    int W = tmpSize; //i.width();
    int H = tmpSize; //i.height();

    Buffer d_ip = Buffer(context, CL_MEM_READ_ONLY, W*H*sizeof(float));
    Buffer d_op = Buffer(context, CL_MEM_WRITE_ONLY, W*H*sizeof(float));

    queue.enqueueWriteBuffer(d_ip, CL_TRUE, 0, W*H*sizeof(float), my2D);

    std::ifstream sourceFileName("c:\\users\\me\\desktop\\img_rotate_kernel.cl");
    std::string sourceFile(istreambuf_iterator<char>(sourceFileName), (istreambuf_iterator<char>()));

    Program::Sources rotn_source(1,std::make_pair(sourceFile.c_str(), sourceFile.length() + 1));
    Program rotn_program(context, rotn_source);
    rotn_program.build(devices); // <----- CRASHES HERE
}
定义无标准向量
#定义\uu CL\u启用\u异常
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cl;
int _tmain(int argc,_TCHAR*argv[]
{
int-tmpSize=1024;
浮动**my2D=新浮动*[tmpSize];
对于(int i=0;i=0)和((int)ypos:

cl::Program::Program返回一个有效的程序对象,如果程序对象为 已成功创建。否则,它将返回在err[…]中返回的以下错误值之一

您的程序对象可能未正确创建,请更改程序构造调用以使用此签名后的
err
参数

cl::Program::Program(const Context& context, const Sources& sources, cl_int * err = NULL)
在对程序对象执行任何其他操作之前,请确保
err==CL\u SUCCESS

大多数OpenCL调用都允许您传递一个指向错误参数的指针。您应该这样做,并在调用后检查它(至少在调试版本中),以减少将来的麻烦


好的,我对你的源代码做了一些修改。在这里,我会解释一下我的修改

#define __NO_STD_VECTOR 
#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <CL/cl.h>

#define ARRAY_SIZE 128

using namespace std;
using namespace cl;

int main(int, char**)
{
    int err;

    float my2D[ARRAY_SIZE * ARRAY_SIZE] = { 0 };
    for(int i = 0; i < ARRAY_SIZE * ARRAY_SIZE; i++)
    {
        my2D[i] = 5;
    }

    cl::vector <Platform> platforms;
    err = Platform::get(&platforms);

    if(err != CL_SUCCESS) {
        std::cout << "Platform::get failed - " << err << std::endl;
        std::cin.get();
    }

    cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0]()), 0 };
    Context context(CL_DEVICE_TYPE_ALL, cps, nullptr, nullptr, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Context::Context failed - " << err << std::endl;
        std::cin.get();
    }

    cl::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>(&err);

    if(err != CL_SUCCESS) {
        std::cout << "Context::getInfo failed - " << err << std::endl;
        std::cin.get();
    }

    CommandQueue queue = CommandQueue(context, devices[0], 0, &err);

    if(err != CL_SUCCESS) {
        std::cout << "CommandQueue::CommandQueue failed - " << err << std::endl;
        std::cin.get();
    }

    int W = ARRAY_SIZE; //i.width();
    int H = ARRAY_SIZE; //i.height();

    Buffer d_ip = Buffer(context, CL_MEM_READ_ONLY, W*H*sizeof(float), nullptr, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Buffer::Buffer 1 failed - " << err << std::endl;
        std::cin.get();
    }

    Buffer d_op = Buffer(context, CL_MEM_WRITE_ONLY, W*H*sizeof(float), nullptr, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Buffer::Buffer 2 failed - " << err << std::endl;
        std::cin.get();
    }

    err = queue.enqueueWriteBuffer(d_ip, CL_TRUE, 0, W*H*sizeof(float), &my2D[0]);

    if(err != CL_SUCCESS) {
        std::cout << "Queue::enqueueWriteBuffer failed - " << err << std::endl;
        std::cin.get();
    }

    std::ifstream sourceFileName("so_question.cl");
    std::string sourceFile(std::istreambuf_iterator<char>(sourceFileName), (std::istreambuf_iterator<char>()));

    Program::Sources rotn_source(1,std::make_pair(sourceFile.c_str(), sourceFile.length() + 1));
    Program rotn_program(context, rotn_source, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Program::Program failed - " << err << std::endl;
        std::cin.get();
    }

    err = rotn_program.build(devices);

    if(err != CL_SUCCESS) {
        std::cout << "Program::build failed - " << err << std::endl;
        std::cin.get();
    }
}
但是,您可能无法使用1024 x 1024的
float
数组来执行此操作,因为这样会占用堆栈空间。如果您需要这么大的数组,您可能需要
new
一个足够大的一维数组来容纳您的数据并自己执行索引算法。这样可以确保获得整个存储空间作为一个连续的块进行配速

现在,在调用
err=rotn\u PROGRAM.BUILD()
时,代码出现了
CL\u BUILD\u PROGRAM\u FAILURE
错误,这意味着您的CL程序代码中可能有错误。由于这是一个完全不同的问题,我将让您解决这个问题。

来自:

cl::Program::Program返回一个有效的程序对象,如果程序对象为 已成功创建。否则,它将返回在err[…]中返回的以下错误值之一

您的程序对象可能未正确创建,请更改程序构造调用以使用此签名后的
err
参数

cl::Program::Program(const Context& context, const Sources& sources, cl_int * err = NULL)
在对程序对象执行任何其他操作之前,请确保
err==CL\u SUCCESS

大多数OpenCL调用都允许您传递一个指向错误参数的指针。您应该这样做,并在调用后检查它(至少在调试版本中),以减少将来的麻烦


好的,我对你的源代码做了一些修改。在这里,我会解释一下我的修改

#define __NO_STD_VECTOR 
#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <CL/cl.h>

#define ARRAY_SIZE 128

using namespace std;
using namespace cl;

int main(int, char**)
{
    int err;

    float my2D[ARRAY_SIZE * ARRAY_SIZE] = { 0 };
    for(int i = 0; i < ARRAY_SIZE * ARRAY_SIZE; i++)
    {
        my2D[i] = 5;
    }

    cl::vector <Platform> platforms;
    err = Platform::get(&platforms);

    if(err != CL_SUCCESS) {
        std::cout << "Platform::get failed - " << err << std::endl;
        std::cin.get();
    }

    cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0]()), 0 };
    Context context(CL_DEVICE_TYPE_ALL, cps, nullptr, nullptr, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Context::Context failed - " << err << std::endl;
        std::cin.get();
    }

    cl::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>(&err);

    if(err != CL_SUCCESS) {
        std::cout << "Context::getInfo failed - " << err << std::endl;
        std::cin.get();
    }

    CommandQueue queue = CommandQueue(context, devices[0], 0, &err);

    if(err != CL_SUCCESS) {
        std::cout << "CommandQueue::CommandQueue failed - " << err << std::endl;
        std::cin.get();
    }

    int W = ARRAY_SIZE; //i.width();
    int H = ARRAY_SIZE; //i.height();

    Buffer d_ip = Buffer(context, CL_MEM_READ_ONLY, W*H*sizeof(float), nullptr, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Buffer::Buffer 1 failed - " << err << std::endl;
        std::cin.get();
    }

    Buffer d_op = Buffer(context, CL_MEM_WRITE_ONLY, W*H*sizeof(float), nullptr, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Buffer::Buffer 2 failed - " << err << std::endl;
        std::cin.get();
    }

    err = queue.enqueueWriteBuffer(d_ip, CL_TRUE, 0, W*H*sizeof(float), &my2D[0]);

    if(err != CL_SUCCESS) {
        std::cout << "Queue::enqueueWriteBuffer failed - " << err << std::endl;
        std::cin.get();
    }

    std::ifstream sourceFileName("so_question.cl");
    std::string sourceFile(std::istreambuf_iterator<char>(sourceFileName), (std::istreambuf_iterator<char>()));

    Program::Sources rotn_source(1,std::make_pair(sourceFile.c_str(), sourceFile.length() + 1));
    Program rotn_program(context, rotn_source, &err);

    if(err != CL_SUCCESS) {
        std::cout << "Program::Program failed - " << err << std::endl;
        std::cin.get();
    }

    err = rotn_program.build(devices);

    if(err != CL_SUCCESS) {
        std::cout << "Program::build failed - " << err << std::endl;
        std::cin.get();
    }
}
但是,您可能无法使用1024 x 1024的
float
数组来执行此操作,因为这样会占用堆栈空间。如果您需要这么大的数组,您可能需要
new
一个足够大的一维数组来容纳您的数据并自己执行索引算法。这样可以确保获得整个存储空间作为一个连续的块进行配速


代码现在在
err=rotn\u PROGRAM.BUILD()上的
CL\u BUILD\u PROGRAM\u失败时出错
调用,这意味着您的CL程序代码中可能有错误。由于这是一个完全不同的问题,我将让您解决这个问题。

感谢您向我演示如何执行此操作。不幸的是,它仍在崩溃。-->int e=-1;program rotn_program(context,rotn_source,&e);if(e==CL_SUCCESS)e=rotn_program.build(设备);再次感谢!平台被故意设置为1,但我不知道其他内容。至于内核,它缺少开头{。感谢你告诉我如何做。不幸的是,它仍然崩溃。-->int e=-1;Program rotn_Program(context,rotn_source,&e);if(e==CL_SUCCESS)e=rotn_Program.build(设备);再次感谢!平台故意设置为1,但我不知道其他内容。至于内核,它缺少开头{。