Can I call the same kernel object "search_kernel" multiple times in a loop, each time supplying different kernel arguments?

For example -

Code :
cl_mem args[32];
cl_kernel search_kernel;
 
search_kernel = clCreateKernel(program, "search_kernel", &err1);
 
// set and intialize each of memory object args[32]
 
for (i = 0; i < 32; i++) {
    // we set a different kernel arg for the same kernel in every iteration
    clSetKernelArg(search_kernel, 0, sizeof(cl_mem), &args[i]);
 
    clEnqueuNDRangeKernel(search_kernel); // enqueue the kernel.
}

Because the spec says that - "A kernel is a function declared in a program. A kernel is identified by the __kernel qualifier applied to any function in a program. A kernel object encapsulates the specific __kernel function declared in a program and the argument values to be used when executing this
__kernel function
."

If I understand what they are saying above, I will have create a new kernel so that the different kernel arguments over each loop iteration are associated with their respective kernel object, and are not set to the same kernel object over each iteration -

Code :
cl_mem args[32]; // kernel arguments corresponding to their kernel objects
cl_kernel search_kernel[32]; // define a kernel object for each iteration
 
for (i = 0; i < 32; i++){
    // create a kernel object for each iteration of the loop
    search_kernel[i] = clCreateKernel(program, "search_kernel", &err1);
}
 
//initialize and set the buffer memory for args[32]
 
for (i = 0; i < 32; i++) {
    clSetKernelArg(search_kernel[i], 0, sizeof(cl_mem), &args[i]);
 
    clEnqueueNDRangeKernel(search_kernel[i]);
}