Ho anche venuto attraversare tale bug pochi giorni fa e ho appena lavorare fuori. Quindi sono qui per condividere la mia soluzione sebbene sia abbastanza cablata e non so ancora perché.
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");
}
Questo è il mio codice originale che è una funzione statica chiamata da un costruttore di una classe. Il costruttore può essere chiamato senza alcuna domanda. Tuttavia, ogni volta che viene richiamata la funzione precedente, avrei ricevuto il bug "nome del kernel non valido" risultante da opencl, impossibile trovare il kernel "filterSubsampleUChar4Kernel". Ho provato molto ma nessuno di loro ha funzionato. Ma oggi, ogni tanto, provo a cambiare il nome della funzione e ci riesco. Quello che faccio è nient'altro che cambiare "filterSubsampleUChar4Kernel" in "filterSubsampleKernel". Ho anche provato a cambiare altri nomi, ad es. "filterSubsampleKernel_test", "filterSubsample1Kernel". Ma loro non hanno funzionato. È abbastanza cablato, non è vero?
Giusto per chiarire: si sa che la compilazione riesce nel primo caso perché si sta verificando il codice di errore impostato da clBuildProgram, corretto? – James
I passaggi di compilazione restituiscono CL_SUCCESS, ma controllo anche il log di build – Zhen
Stai dicendo che se rimuovi semplicemente la riga cl_khr_fp64, clCreateKernel restituisce CL_SUCCESS? – vocaro