kranti

Problem with the squares problem from tutorial

Discussion created by kranti on Nov 23, 2010
Latest reply on Nov 24, 2010 by himanshu.gautam

Hi, I am using the code given in http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20(201005).pdf to find the squares of the numbers from 1 to 10. What I need to do is, send a argument to the function, and get the square of that number. The code is attached. When I try to run the file, I get the following errors : 

 

 

devuser@devuser-desktop:~/Desktop/opencl/hello$ g++ -o sqr -I$ATISTREAMSDKROOT/include -L$ATISTREAMSDKROOT/lib/x86 squares.cpp -lOpenCL

squares.cpp: In function ‘int square(int)’:

squares.cpp:75: error: invalid conversion from ‘int’ to ‘const void*’

squares.cpp:75: error:   initializing argument 6 of ‘cl_int clEnqueueWriteBuffer(_cl_command_queue*, _cl_mem*, cl_bool, size_t, size_t, const void*, cl_uint, _cl_event* const*, _cl_event**)’

squares.cpp:89: error: invalid conversion from ‘int’ to ‘void*’

squares.cpp:89: error:   initializing argument 6 of ‘cl_int clEnqueueReadBuffer(_cl_command_queue*, _cl_mem*, cl_bool, size_t, size_t, void*, cl_uint, _cl_event* const*, _cl_event**)’

What is going wrong?


#include <stdio.h> #include "CL/cl.h" //#define DATA_SIZE 10 const char *KernelSource = "__kernel void hello(__global float *input, __global float *output)\n"\ "{\n"\ " size_t id = get_global_id(0);\n"\ " output[id] = input[id] * input[id];\n"\ "}\n"\ "\n"; int square(int val) { cl_context context; cl_context_properties properties[3]; cl_kernel kernel; cl_command_queue command_queue; cl_program program; cl_int err; cl_uint num_of_platforms=0; cl_platform_id platform_id; cl_device_id device_id; cl_uint num_of_devices=0; cl_mem input, output; size_t global; int inputData=val; int results=0; int i; // retreives a list of platforms available if (clGetPlatformIDs(1, &platform_id, &num_of_platforms)!= CL_SUCCESS) { printf("Unable to get platform_id\n"); return 1; } // try to get a supported GPU device if (clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &num_of_devices) != CL_SUCCESS) { printf("Unable to get device_id\n"); return 1; } // context properties list - must be terminated with 0 properties[0]= CL_CONTEXT_PLATFORM; properties[1]= (cl_context_properties) platform_id; properties[2]= 0; // create a context with the GPU device context = clCreateContext(properties,1,&device_id,NULL,NULL,&err); // create command queue using the context and device command_queue = clCreateCommandQueue(context, device_id, 0, &err); // create a program from the kernel source code program = clCreateProgramWithSource(context,1,(const char **) &KernelSource, NULL, &err); // compile the program if (clBuildProgram(program, 0, NULL, NULL, NULL, NULL) != CL_SUCCESS) { printf("Error building program\n"); return 1; } // specify which kernel from the program to execute kernel = clCreateKernel(program, "hello", &err); // create buffers for the input and ouput input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(int) , NULL, NULL); output = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(int) , NULL, NULL); // load data into the input buffer /* ****************************************** ERROR IS HERE ********************************************/ clEnqueueWriteBuffer(command_queue, input, CL_TRUE, 0, sizeof(int) , inputData, 0, NULL, NULL); // set the argument list for the kernel command clSetKernelArg(kernel, 0, sizeof(cl_mem), &input); clSetKernelArg(kernel, 1, sizeof(cl_mem), &output); // global=DATA_SIZE; // enqueue the kernel command for execution clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global, NULL, 0, NULL, NULL); clFinish(command_queue); // copy the results from out of the output buffer /* ****************************************** ERROR IS HERE ********************************************/ clEnqueueReadBuffer(command_queue, output, CL_TRUE, 0, sizeof(int), results, 0, NULL, NULL); // print the results printf("output: "); // for(i=0;i<DATA_SIZE; i++) { printf("%d ",results); } // cleanup - release OpenCL resources clReleaseMemObject(input); clReleaseMemObject(output); clReleaseProgram(program); clReleaseKernel(kernel); clReleaseCommandQueue(command_queue); clReleaseContext(context); return results; } int main() { int i = square(6); return 0; }

Outcomes