|
|
Message-ID: <4209f501.1c5a4d99.51db9d63.74755@o2.pl>
Date: Tue, 09 Jul 2013 07:19:31 +0200
From: marcus.desto <marcus.desto@...pl>
To: john-dev@...ts.openwall.com
Subject: Re: String pass to GPU and get back
Hi Magnum,
thank you for your help. I appreciate that.
I am wondering why I should read an input buffer before running the kernel. Is this really necessary?
Besides, I think I have found the problem. It was
cl_uint out_global[bufferC_size];
It should be
cl_uchar out_global[bufferC_size];
Regards,
Marcus
Dnia 8 lipca 2013 0:36 magnum <john.magnum@...hmail.com> napisaĆ(a):
> Just looking at your code I think you miss an enqueueReadBuffer() of bufferA before running the kernel.
>
> magnum
>
>
> On 7 Jul, 2013, at 22:08 , marcus.desto <marcus.desto@...pl> wrote:
>
> > Hi,
> >
> > I have troubles with setting up a program to use some of your opencl implementations.
> > Therefore I try to understand how to pass a string to the GPU and get it back to the host program to print it.
> > I did it with a uint array without problems. But using uchar for passing a string I stuck.
> >
> > OpenCL:
> > __kernel void same_in_same_out_char(__global uchar * out, __constant uchar * in){
> > for (unsigned int ui=0; ui<3; ui++) out[ui]=in[ui];
> > }
> >
> > C++
> > #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("inout.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, "same_in_same_out_char");
> >
> > // create a message to send to kernel ----------------------------------------------------------------
> > const char pwd[] = "MAX";
> > cout << "char pwd[] : " << pwd << endl;
> > cl_uchar * password = (cl_uchar*) &pwd;
> > int bufferA_size = 3; // array size is 3
> >
> > int bufferC_size = 3; // array size is 3
> > cout << " -- OpenCL -- " << endl;
> > // ---------------------------------------------------------------------------------------------------
> > // allocate device buffer to hold message
> > cl::Buffer bufferA(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar) * bufferA_size, password);
> > cl::Buffer bufferC(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar) * bufferC_size);
> >
> > // set message as kernel argument
> > kernel.setArg(0, bufferC);
> > kernel.setArg(1, bufferA);
> >
> > // execute kernel
> > queue.enqueueTask(kernel);
> >
> > // wait for completion
> > queue.finish();
> > // ----------------------
> >
> > cl_uint out_global[bufferC_size];
> > queue.enqueueReadBuffer(bufferC, CL_TRUE, 0, bufferC_size*sizeof(cl_uchar), &out_global);
> >
> > cout << "Output \t\t:" << *out_global << endl << "Output[1..n] \t:";
> > for (unsigned int i=0; i<bufferC_size; i ++) cout << out_global[i] << " " ;
> >
> > cout << endl;
> > } catch (cl::Error e) {
> > cout << endl << e.what() << " : " << e.err() << endl;
> > }
> >
> > return 0;
> >
> > }
> >
> > Any ideas?
> >
> > (Thanks)
> > Regards
> > Marcus
> >
>
>
>
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.