OpenCL enqueueNDRangeKernelによりアクセス違反エラーが発生する

ビルドしようとしているすべてのカーネルで、継続的にアクセス違反エラーが発生しています。私が本から取っている他のカーネルは正常に動作するようです。

https://github.com/ssarangi/VideoCL - This is where the code is.

これには何かがないようです。誰かが私にこれを手伝ってもらえますか?

本当にありがとう。

[ジェームス] - 提案していただきありがとうございます、あなたは正しいです。私はAMD RedwoodカードでWin 7でやっています。私はAMD APP SDK 2.5を搭載したCatalyst 11.7ドライバを持っています。私は以下のコードを投稿しています。

#include 
#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;
    }
}

I am getting the error at the queue->enqueueNDRangeKernel line. I have the queue and the kernel stored in a class.

CLManager::CLManager()
    : m_programIDs(-1)
{
   //Initialize the Platform
    cl::Platform::get(&m_platforms);

   //Create a Context
    cl_context_properties cps[3] = {
        CL_CONTEXT_PLATFORM,
        (cl_context_properties)(m_platforms[0])(),
        0
    };

    m_context = cl::Context(CL_DEVICE_TYPE_GPU, cps);

   //Get a list of devices on this platform
    m_devices = m_context.getInfo();

    cl_int err;

    m_queue = new cl::CommandQueue(m_context, m_devices[0], 0, &err);
}


cl::Kernel* CLManager::makeKernel(unsigned int programID, std::string kernelName)
{
    cl::CommandQueue queue = cl::CommandQueue(m_context, m_devices[0]);

    cl::Kernel* kernel = new cl::Kernel(*(m_programs[programID]), kernelName.c_str());

    m_kernels.push_back(kernel);

    return kernel;
}
2
こんにちは、ssarangi。あなたはここで深刻な助けを得るために十分に言及していません。プラットフォームとCLの実装について教えてください。また、問題のあるコードを投稿する必要があります。外部のリポジトリにリンクすることは悪い考えです。そのリンクは有効ではない可能性があるためです。
追加された 著者 James,

1 答え

あなたのコードをチェックしました。私はLinuxにもかかわらず。実行時に、 CL_INVALID_MEM_OBJECT を意味するエラー -38 が表示されます。だから私はあなたのバッファーに行きました。

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);

But setArg is expecting a value, so the buffer pointers should be dereferenced:

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

これらの変更の後、猫は回転する;)

4
追加された
どうもありがとう。これを見逃すのは私の愚かだった。これは実際に問題を解決しました。再度、感謝します。
追加された 著者 ssarangi,
カーネルの引数として配列(実際は最初の値へのポインタ)を渡すので、配列の追加はおそらくokです。
追加された 著者 rdoubleui,