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.
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);