cancel
Showing results for 
Search instead for 
Did you mean: 

Archives Discussions

krishnan
Journeyman III

Issues with building kernel code and malloc

Hi folks

I've been trying to build this kernel code for a few days now, and I have seen some very peculiar errors. (the host side code for loading and building the code are given below.)

When the last line of my `blob1_kernel.cl' is `}', I get the error:

`blob1: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted'

(I get the same error when I remove some of the #defines at the top of `blob1_kernel.cl').

When the last line of `blob1_kernel.cl' is blank and I preserve all the #defines, I get the error:

`Build failed. Error Code=-11
--- Build Log -- '

Presumably, this error is coming from clBuildProgram. The Build Log is empty. Even when I deliberately break the code, and I know the errors that should be reported, the Build Log remains empty.

I have attached the code I have used to load and build kernel source. I wonder if anyone can tell me what I'm doing wrong. Please let me know if a better description of the problem is needed.

//Relevant CL declarations cl_context context; cl_program program; cl_int err; cl_device_id device_id; //Variables to read kernel source FILE *fp; long filelen; long readlen; char *kernel_src; // char string to hold kernel source //Read the kernel fp = fopen("blob1_kernel.cl","r"); fseek(fp,0L, SEEK_END); filelen = ftell(fp); rewind(fp); kernel_src = malloc(sizeof(char)*(filelen+1)); readlen = fread(kernel_src,1,filelen,fp); if(readlen!=filelen) { printf("error reading file\n"); exit(1); } //ensure that the string is NULL terminated kernel_src[filelen+1]='\0'; //Basic OpenCL setup of context, command queue etc. // create program object from source. kernel_src contains // source read from file earlier program = clCreateProgramWithSource(context, 1 , (const char **) &kernel_src, NULL, &err); if (err != CL_SUCCESS) { printf("Unable to create program object. Error Code=%d\n",err); exit(1); } err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL); if (err != CL_SUCCESS) { printf("Build failed. Error Code=%d\n", err); size_t len; char buffer[4096]; // get the build log clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len); printf("--- Build Log -- \n %s\n",buffer); exit(1); }

0 Likes
3 Replies
nou
Exemplar

kernel_src[filelen+1]='\0';

should be

kernel_src[filelen]='\0';

0 Likes

Tried that, no difference. I still get a build failure and empty build log.

0 Likes

krishnan,

Did you try debugging the host code to narrow down where problem might be?

A common practice is to allocate build info buffer at runtime after querying its size from clGetProgramInfo API. Also check for error in this API, it returns the error code as the return value.

Thanks

0 Likes