Tôi cũng đã vượt qua lỗi đó một vài ngày trước và tôi chỉ làm việc nó ra. Vì vậy, tôi ở đây chia sẻ giải pháp của tôi mặc dù nó khá có dây và tôi vẫn không biết tại sao.
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");
}
Đây là mã ban đầu của tôi là hàm tĩnh được gọi bởi hàm tạo của một số lớp. Hàm khởi tạo có thể được gọi mà không có bất kỳ câu hỏi nào. Tuy nhiên, mỗi khi hàm trên được gọi, tôi sẽ nhận được lỗi "tên kernel không hợp lệ" do opencl không thể tìm thấy hạt nhân "filterSubsampleUChar4Kernel". Tôi đã thử rất nhiều nhưng không ai trong số họ làm việc. Nhưng hôm nay, rất thỉnh thoảng, tôi cố gắng thay đổi tên hàm và tôi thành công. Điều tôi làm là không có gì thay đổi "filterSubsampleUChar4Kernel" thành "filterSubsampleKernel". Tôi cũng đã cố gắng thay đổi tên khác, ví dụ: "filterSubsampleKernel_test", "filterSubsample1Kernel". Nhưng họ không làm việc. Nó khá có dây, phải không?
Chỉ cần làm rõ - bạn biết rằng trình biên dịch của bạn thành công trong trường hợp đầu tiên vì bạn đang kiểm tra mã lỗi được thiết lập bởi clBuildProgram, đúng không? – James
Các bước biên dịch trả về CL_SUCCESS, nhưng tôi cũng kiểm tra nhật ký xây dựng – Zhen
Bạn có nói rằng nếu bạn chỉ cần loại bỏ dòng cl_khr_fp64, clCreateKernel trả về CL_SUCCESS? – vocaro