4 Replies Latest reply on Jul 22, 2010 1:32 PM by Paccone

    Kernel doesn't load in program object

    Paccone

      Hi I'm a newbie I'm missing something when try to load a kernel into program object.

      The opencl initialization runs fine, until it gets to load the kernel:

       

      // Wait what a kernel!
      char kernelio[] = "__kernel void karmelo(__global const int a, __global int b)  {b = a + 1;}";

      // count bytes
      size_t kdim;
      for(kdim = 0; kernelio[kdim] != '\0'; kdim++);
      cout << "kernel read" << endl;
         
      // Insert kernel in program object
      cl_program program = clCreateProgramWithSource(contesto, 1, (const char **)&kernelio,
          (const size_t *)&kdim, &context_err);

      cout << "kernel inserted in program object" << endl;


      When launch the binary, I get only the "kernel read" response message, followed by "Segmentation fault" and end.

      I cant figure out the issue!

       



        • Kernel doesn't load in program object
          nou

          __global must be pointer so

          __kernel void kernelo(__global int *a, __global int b)
          {
               b[get_global_id(0)] = a[get_global_id(0)] + 1;
          }

            • Kernel doesn't load in program object
              Paccone

              Thank you I changed the kernel string this way but the result is exactly the same before:

               

              char kernelio[] =
                  "__kernel void karmelo(__global int* a, __global int* b) {b[get_global_id(0)] = a[get_global_id(0)] + 1;}";


              The trouble lies all in those sets of code. I think it concerns with array deferentiation or sistax misses in "address-poiter" parameters of clCreateProgramWithSource

               



                • Kernel doesn't load in program object
                  Paccone

                  I can get it work if I change the method to insert kernel in the string.

                  I replace this:

                   

                  // Wait what a kernel!
                      char kernelio[] =
                      "__kernel void karmelo(__global int* a, __global int* b) {b[get_global_id(0)] = a[get_global_id(0)] + 1;}";
                      // count bytes
                      size_t kdim;
                      for(kdim = 0; kernelio[kdim] != '\0'; kdim++);
                      cout << "kernel read" << endl;


                  with this:

                   

                  // Load the kernel source code into the array source_str
                      FILE *fp;
                          char *source_str;
                          size_t source_size;
                   
                          fp = fopen("vector_add_kernel.cl", "r");
                          if (!fp) {
                              fprintf(stderr, "Failed to load kernel.\n");
                              exit(1);
                          }
                          source_str = (char*)malloc(1000);
                          source_size = fread( source_str, 1, 1000, fp);

                          fclose( fp );



                  that i found in an example.

                  It loads still this kernel, but from file:

                   

                  __kernel void karmelo(__global int* a, __global int* b) {b[get_global_id(0)] = a[get_global_id(0)] + 1;}


                  The final well behaving code chunk is:

                   

                  // Load the kernel source code into the array source_str
                      FILE *fp;
                          char *source_str;
                          size_t source_size;
                   
                          fp = fopen("vector_add_kernel.cl", "r");
                          if (!fp) {
                              fprintf(stderr, "Failed to load kernel.\n");
                              exit(1);
                          }
                          source_str = (char*)malloc(1000);
                          source_size = fread( source_str, 1, 1000, fp);
                          fclose( fp );

                     
                      // Insert kernel in program object
                      cl_program program =
                      clCreateProgramWithSource(contesto, 1, (const char **)&source_str,
                          (const size_t *)&source_size, NULL);

                      cout << "kernel inserted in program object" << endl;



                  and the issue more than before seems to be in pointer dereference.