Results 1 to 4 of 4

Thread: clEnqueueTask : -52

  1. #1
    Newbie
    Join Date
    Jul 2013
    Posts
    4

    Red face clEnqueueTask : -52

    Hello opencl community,

    I just started learning opencl. In the last few days, I solved my programing problems by myself. Since yesterday, I have a problem I cannot solve by myself. So, I ask for your help.

    After some hello-world tutorial programs I started with little complex tasks. I want to use an implemented opencl kernel to encrypt some short passwords.

    My frist question is, whether I have to buffer a single value variable (for expl. a single factor) the same way as arrays/pointers to pass it to the kernel.

    I wrote this program:
    Code :
    #define __CL_ENABLE_EXCEPTIONS
     
    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <CL/cl.hpp>
    #include <CL/opencl.h>
     
    using namespace std;
    int main () {
     
        vector<cl::Platform> platforms;
        vector<cl::Device> devices;
        vector<cl::Kernel> kernels;
     
        try {
     
            // create platform
            cl::Platform::get(&platforms);
            platforms[0].getDevices(CL_DEVICE_TYPE_GPU, &devices);
     
            // create context
            cl::Context context(devices);
     
            // create command queue
            cl::CommandQueue queue(context, devices[0]);
     
            // load opencl source
            ifstream cl_file("pbkdf2_kernel.cl");
            string cl_string(istreambuf_iterator<char>(cl_file), (istreambuf_iterator<char>()));
            cl::Program::Sources source(1, make_pair(cl_string.c_str(), 
                cl_string.length() + 1));
     
            // create program
            cl::Program program(context, source);
     
            // compile opencl source
            program.build(devices);
     
            // load named kernel from opencl source
            cl::Kernel kernel(program, "PBKDF2");
     
            // create a message to send to kernel ----------------------------------------------------------------
            char* password = "C & OpenCL is cool";
            //unsigned int keyBytes = 18; // keyBytes
            cl_int keyBytes = 18; // keyBytes  
     
            char* passwordSalt = "12345678901234567890123456789012";
            cl_int passwordSaltLen = 32;
     
            cl_int passwordIterations = 2;
     
            // ---------------------------------------------------------------------------------------------------
            // allocate device buffer to hold message
            cl::Buffer bufferA(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(char) * keyBytes, password);
            cl::Buffer bufferB(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(char) * passwordSaltLen, passwordSalt);
            cl::Buffer bufferC(context, CL_MEM_WRITE_ONLY, sizeof(char) * keyBytes);
     
            queue.enqueueWriteBuffer(bufferA, CL_TRUE, 0, keyBytes * sizeof(char), password);
            queue.enqueueWriteBuffer(bufferB, CL_TRUE, 0, passwordSaltLen * sizeof(char), passwordSalt);
     
    //void PBKDF2 ( const __global unsigned int *pass_global,
    //              const __global unsigned int *salt, int usrlen, uint num_keys, __global unsigned int *out_global)
     
            // set message as kernel argument
            kernel.setArg(0, bufferA);
            kernel.setArg(1, bufferB);
            kernel.setArg(2, passwordIterations);
            kernel.setArg(3, keyBytes);
     
             // execute kernel
            queue.enqueueTask(kernel);
     
            // wait for completion
            queue.finish();
            // ----------------------
            char* out_global = "                 !";
     
    	queue.enqueueReadBuffer(bufferC, CL_TRUE, 0, keyBytes * sizeof(char), out_global);
            cout << "Output " << out_global << endl;
            // ----------------------
            cout << endl;
     
        } catch (cl::Error e) {
            cout << endl << e.what() << " : " << e.err() << endl;
        }
     
        return 0;
     
    }

    Well, the used implementation of pbkdf2-hmac-sha1 can be accessed by the function:
    Code :
    void PBKDF2 ( const __global unsigned int *pass_global, const __global unsigned int *salt, int usrlen, uint num_keys, __global unsigned int *out_global) {
    ...
    }

    The used implementation of pbkdf2-hmac-sha1 is written by Sayantan Datta.

    I get to following error msg, I cannot handle:
    clEnqueueTask : -52
    Can someone help, please?

    Thank you,

    Regards,
    Pit

  2. #2
    -52 is CL_INVALID_KERNEL_ARGS, and indeed you are passing 4 args to a kernel that needs 5 of them.

  3. #3
    Newbie
    Join Date
    Jul 2013
    Posts
    4
    Hi,

    thanks. I fixed that, but now I get
    clBuildProgram : -11
    -- FIXED

    I fixed the upper problem. Now, I get
    clCreateKernel : -46
    Last edited by python; 07-05-2013 at 06:14 AM.

  4. #4
    Senior Member
    Join Date
    Dec 2011
    Posts
    168
    Do clGetProgramInfo to get the build log. It will tell your where your error is in your kernel. AMD and others also have interactive tools that you can paste your kernel into and they will highlight errors. Also, look up the error codes in cl.h and check with the documentation; these will both give you more insight into your error rather than just a number.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •