OpenCL enqueueNDRangeKernel导致访问冲突错误

OpenCL enqueueNDRangeKernel导致访问冲突错误,opencl,Opencl,我不断地得到一个访问冲突错误与我的所有内核,我试图建立。我从书中取的其他内核似乎也很好用 -这就是代码所在的位置 这里面好像少了点什么。有人能帮我吗 非常感谢 [詹姆斯]-谢谢你的建议,你是对的。我用AMD红木牌赢了7场。我有带AMD应用程序SDK 2.5的Catalyst 11.7驱动程序。我把代码贴在下面 #include <iostream> #include "bmpfuncs.h" #include "CLManager.h" void main() { flo

我不断地得到一个访问冲突错误与我的所有内核,我试图建立。我从书中取的其他内核似乎也很好用

-这就是代码所在的位置

这里面好像少了点什么。有人能帮我吗

非常感谢

[詹姆斯]-谢谢你的建议,你是对的。我用AMD红木牌赢了7场。我有带AMD应用程序SDK 2.5的Catalyst 11.7驱动程序。我把代码贴在下面

#include <iostream>
#include "bmpfuncs.h"

#include "CLManager.h"

void main()
{
    float theta = 3.14159f/6.0f;
    int W ;
    int H ;

    const char* inputFile = "input.bmp";
    const char* outputFile = "output.bmp";

    float* ip = readImage(inputFile, &W, &H);
    float *op = new float[W*H];

    //We assume that the input image is the array “ip”
    //and the angle of rotation is theta
    float cos_theta = cos(theta);
    float sin_theta = sin(theta);

    try
    {
        CLManager* clMgr = new CLManager();

        // Build the Source
        unsigned int pgmID = clMgr->buildSource("rotation.cl");

        // Create the kernel
        cl::Kernel* kernel = clMgr->makeKernel(pgmID, "img_rotate");

        // Create the memory Buffers
        cl::Buffer* clIp = clMgr->createBuffer(CL_MEM_READ_ONLY, W*H*sizeof(float));
        cl::Buffer* clOp = clMgr->createBuffer(CL_MEM_READ_WRITE, W*H*sizeof(float));

        // Get the command Queue
        cl::CommandQueue* queue = clMgr->getCmdQueue();
        queue->enqueueWriteBuffer(*clIp, CL_TRUE, 0, W*H*sizeof(float), ip);

        // Set the arguments to the kernel
        kernel->setArg(0, clOp);
        kernel->setArg(1, clIp);
        kernel->setArg(2, W);
        kernel->setArg(3, H);
        kernel->setArg(4, sin_theta);
        kernel->setArg(5, cos_theta);

        // Run the kernel on specific NDRange
        cl::NDRange globalws(W, H);


        queue->enqueueNDRangeKernel(*kernel, cl::NullRange, globalws, cl::NullRange);

        queue->enqueueReadBuffer(*clOp, CL_TRUE, 0, W*H*sizeof(float), op);

        storeImage(op, outputFile, H, W, inputFile);
    }
    catch(cl::Error error)
    {
        std::cout << error.what() << "(" << error.err() << ")" << std::endl;
    }
}
#包括
#包括“bmpfuncs.h”
#包括“CLManager.h”
void main()
{
浮动θ=3.14159f/6.0f;
int W;
int-H;
const char*inputFile=“input.bmp”;
const char*outputFile=“output.bmp”;
float*ip=readImage(输入文件,&W,&H);
浮动*op=新浮动[W*H];
//我们假设输入图像是数组“ip”
//旋转角度是θ
浮动cos_θ=cos(θ);
浮点数sin_θ=sin(θ);
尝试
{
CLManager*clMgr=新的CLManager();
//构建源代码
unsigned int pgmID=clMgr->buildSource(“rotation.cl”);
//创建内核
cl::Kernel*Kernel=clMgr->makeKernel(pgmID,“img_旋转”);
//创建内存缓冲区
cl::Buffer*clIp=clMgr->createBuffer(cl_MEM_只读,W*H*sizeof(float));
cl::Buffer*clOp=clMgr->createBuffer(cl_MEM_READ_WRITE,W*H*sizeof(float));
//获取命令队列
cl::CommandQueue*queue=clMgr->getCmdQueue();
队列->排队写入缓冲(*clIp,CL_TRUE,0,W*H*sizeof(float),ip);
//将参数设置为内核
内核->设置参数(0,clOp);
内核->设置参数(1,剪辑);
内核->设置参数(2,W);
内核->设置参数(3,H);
内核->设置参数(4,sin_theta);
内核->设置参数(5,cos_theta);
//在特定的NDRange上运行内核
cl::NDRange globalws(W,H);
queue->enqueueNDRangeKernel(*kernel,cl::NullRange,globalws,cl::NullRange);
队列->排队读取缓冲区(*clOp,CLU TRUE,0,W*H*sizeof(浮点),op);
storeImage(op、outputFile、H、W、inputFile);
}
捕获(cl::错误)
{

std::cout我检查了你的代码。但是我在Linux上。在运行时我得到错误
-38
,这意味着
CL\u无效的MEM\u对象
。所以我去检查了你的缓冲区

cl::Buffer* clIp = clMgr->createBuffer(CL_MEM_READ_ONLY, W*H*sizeof(float));
cl::Buffer* clOp = clMgr->createBuffer(CL_MEM_READ_WRITE, W*H*sizeof(float));
然后将缓冲区作为指针传递:

kernel->setArg(0, clOp);
kernel->setArg(1, clIp);
但是
setArg
需要一个值,因此应该取消对缓冲区指针的引用:

kernel->setArg(0, *clOp);
kernel->setArg(1, *clIp);

在这些更改之后,cat会轮换;)

嗨,ssarangi。你提到的还不够多,无法在这里得到认真的帮助。你应该告诉我们你的平台和CL实现,并发布有问题的代码,包括你自己已经做了哪些工作。链接到外部存储库是一个坏主意,因为该链接可能不会一直以来都是有效的。添加数组可能与显示的代码配合得很好,因为您将数组(但实际上是指向第一个值的指针)作为内核参数传递。非常感谢。我忽略了这一点真是太愚蠢了。这确实解决了问题。再次感谢。
kernel->setArg(0, *clOp);
kernel->setArg(1, *clIp);