ID bài viết: 000086479 Loại nội dung: Xử lý sự cố Lần duyệt cuối: 13/12/2018

Tại sao tôi nhận được lỗi "CL_INVALID_ARG_SIZE" khi sử dụng loại lâu như tham số hạt nhân OpenCL™ trong mã máy chủ?

Môi Trường

    Intel® Quartus® Prime Phiên bản Tiêu chuẩn
    Intel® Quartus® Prime Phiên bản Pro
    SDK FPGA Intel® cho OpenCL™
BUILT IN - ARTICLE INTRO SECOND COMPONENT
Mô tả

Nếu một loại dài đã ký hoặc không được ký được sử dụng trong hàm mã máy chủ OpenCL™ clSetThernetnelArg() như minh họa dưới đây

dữ liệu dài chưa được ký = 1;

clSetThernetnelArg(kernel, 0, sizeof(dài chưa được ký), (void*)&data);

sau đó, một lỗi như sau có thể xảy ra khi mã máy chủ được biên dịch bằng cách sử dụng Intel® SDK cho OpenCL™.

Gọi lại ngữ cảnh: Kích thước tham số sai kích thước

LỖI: CL_INVALID_ARG_SIZE

Vị trí: host/src/main.cpp:91

Không thể đặt kernel arg 0

Lỗi này không xuất hiện cho trường hợp này ở các phiên bản trước 18.1 của Intel® SDK cho OpenCL™. Lỗi hiện xuất hiện vì kích thước của một loại dài không được ký hiệu đã được thay đổi từ 8 đến 16 trong trình biên dịch hạt nhân cơ bản, nhưng kích thước cuộc gọi máy chủ (dài không được ký) vẫn trả về 8.

Các loại ký /không được ký dài không có kích thước xác định trong C99 hoặc OpenCL™ phiên bản 1.X vì vậy máy chủ và thiết bị được phép sử dụng các kích thước khác nhau cho loại.  Như vậy, người ta không bao giờ nên sử dụng nó làm loại tham số cho kernel.  Nó không được đảm bảo là di động giữa các trình biên dịch, thiết bị hoặc thậm chí cả các phiên bản trình biên dịch.  Trong đặc điểm kỹ thuật OpenCL™ 2.0, một loại dài được định nghĩa là 128 bit, nhưng sự mơ hồ C99 vẫn còn. Đặc điểm kỹ thuật OpenCL™ không thêm loại tương thích cl_* nên không thể sử dụng loại dài làm tham số mở rộng một cách an toàn.

Độ phân giải

Giải pháp được đề xuất cho vấn đề này là sử dụng loại do OpenCL™ xác định, chẳng hạn như cl_ulong/dài chưa được ký trong mã máy chủ/thiết bị của bạn.

 

Hoặc bằng cách khác, không sử dụng gọi sizeof() và ép kích thước của tham số dài là 16 byte như minh họa bên dưới.

clSetThernetnelArg(kernel, 0, 16, (void*)&data);

Các sản phẩm liên quan

Bài viết này áp dụng cho 1 sản phẩm

Thiết bị có thể lập trình Intel®

1

Nội dung gốc bằng tiếng Anh trên trang này vừa do con người vừa do máy dịch. Nội dung này chỉ để cung cấp thông tin chung và giúp quý vị thuận tiện. Quý vị không nên tin đây là thông tin hoàn chỉnh hoặc chính xác. Nếu có bất kỳ mâu thuẫn nào giữa bản tiếng Anh và bản dịch của trang này, thì bản tiếng Anh sẽ chi phối và kiểm soát. Xem phiên bản tiếng Anh của trang này.