También llegué a cruzar ese error hace unos días y lo resolví. Así que estoy aquí compartiendo mi solución, aunque está bastante cableada y todavía no sé por qué.
static inline void CreateOCLKernels()
{
std::cout << "ocl lowlevelengine: Creating ocl kernels ...\n";
filterSubsample_ocl_kernel = clCreateKernel(program, "filterSubsampleUChar4Kernel", &clError);
checkErr(clError, "clCreateKernel0");
filterSubsampleWithHoles_float4_ocl_kernel = clCreateKernel(program, "filterSubsampleWithHolesFloat4Kernel", &clError);
checkErr(clError, "clCreateKernel1");
filterSubsampleWithHoles_float_ocl_kernel = clCreateKernel(program, "filterSubsampleWithHolesFloatKernel", &clError);
checkErr(clError, "clCreateKernel2");
gradientX_ocl_kernel = clCreateKernel(program, "gradientXKernel", &clError);
checkErr(clError, "clCreateKernel3");
gradientY_ocl_kernel = clCreateKernel(program, "gradientYKernel", &clError);
checkErr(clError, "clCreateKernel4");
//type-dependent ocl memset kernels
memset_ocl_kernel_Vector4s = clCreateKernel(program, "memsetKernelVector4s", &clError);
checkErr(clError, "clCreateKernel5");
}
Este es mi código original que es una función estática llamada por un constructor de alguna clase. El constructor puede ser llamado sin ninguna pregunta. Sin embargo, cada vez que se llama a la función anterior, recibiría el error "nombre de núcleo inválido" que resulta de opencl no puede encontrar el kernel "filterSubsampleUChar4Kernel". Lo he intentado mucho pero ninguno de ellos funcionó. Pero hoy, muy ocasionalmente, trato de cambiar el nombre de la función y tengo éxito. Lo que hago no es más que cambiar "filterSubsampleUChar4Kernel" a "filterSubsampleKernel". También traté de cambiar otros nombres, ej. "filterSubsampleKernel_test", "filterSubsample1Kernel". Pero no funcionaron. Está bastante conectado, ¿no?
Solo para aclarar: usted sabe que su compilación tiene éxito en el primer caso porque está revisando el código de error establecido por clBuildProgram, ¿correcto? – James
Los pasos de compilación devuelven CL_SUCCESS, pero también verifico el registro de compilación – Zhen
¿Está diciendo que si simplemente elimina la línea cl_khr_fp64, clCreateKernel devuelve CL_SUCCESS? – vocaro