2011-11-22 4 views
9

Tôi có một lỗi trong một kernel OpenCL, khi tôi cố gắng sử dụng phần mở rộng cl_khr_fp64, kernel biên dịch và xây dựng log là trống rỗng, nhưng khi tôi gọi clCreateKernel, Tôi có lỗi CL_INVALID_KERNEL_NAME.Lỗi CL_INVALID_KERNEL_NAME khi tôi sử dụng cl_khr_fp64 trong một hạt nhân

Nguồn thất bại:

#pragma OPENCL EXTENSION cl_khr_fp64 : enable 

__kernel void simple(__global char *x, __global char *y){ 
int id = get_global_id(0); 
y[id]=2*x[id]; 
} 

nguồn này biên dịch đúng:

__kernel void simple(__global char *x, __global char *y){ 
int id = get_global_id(0); 
y[id]=2*x[id]; 
} 

Tôi đang sử dụng OpenCL 1.0 với một Tesla C1060cl_khr_fp64 trong CL_DEVICE_EXTENSIONS, trình điều khiển 280.13 và CL_PLATFORM_VERSIO N = OpenCL 1.1 CUDA 4.0.1

+0

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

+0

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

+0

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

Trả lời

2

Vấn đề là trước khi gọi đến clCreateProgramWithSource, chúng tôi xóa các dòng mới khỏi nguồn. Ví dụ: nguồn:

"__kernel void f(__global char *x){\nint id = get_global_id(0);\nx[id]=2;\n}" 

trở thành:

"__kernel void simple(__global char *x, __global char *y){" 
"int id = get_global_id(0);" 
"x[id]=2;}" 

Nó không gây vấn đề cho đến khi chúng ta thêm chỉ thị preproccessor.

Đây là bộ tiền xử lý OpenCL thực sự muốn các dòng mới có mặt ở đó. Vì vậy, nó phải được viết là:

"__kernel void simple(__global char *x, __global char *y){\n" 
"int id = get_global_id(0);\n" 
"x[id]=2;}\n" 
0

Đây là một trong những điều đã làm tôi khó chịu. Vấn đề tôi nghĩ là mã được biên dịch trước đó được lưu trữ ở đâu đó và được tái sử dụng. Vì vậy, các thay đổi mới của bạn sẽ gây ra lỗi lạ.

Để khắc phục nó (KHÔNG phải là "giải pháp thực" nhưng nó hoạt động cho tôi), hãy thử thay đổi tên chương trình (và tên hạt nhân, có thể), ví dụ: nếu chương trình là a.out thì lần sau bạn biên dịch làm cho nó a2.out và xem nếu nó được sửa. Tôi hi vọng cái này giúp được.

nếu bạn tìm thấy giải pháp tốt hơn, vui lòng cho chúng tôi biết.

0

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?