什么可能导致OpenCL在cl::Program.build上崩溃?
当我尝试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
#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,但我不知道其他内容。至于内核,它缺少开头{。