아래와 같이 OpenCL™ 호스트 코드 함수 clSetKernelArg() 에서 서명되거나 서명되지 않은 긴 형식이 사용되는 경우
서명되지 않은 긴 긴 데이터 = 1;
clSetKernelArg(커널, 0, sizeof(서명되지 않은 긴 길이), (void*)&data);
그런 다음 호스트 코드가 OpenCL™용 인텔® SDK 사용하여 컴파일될 때 다음과 같은 오류가 발생할 수 있습니다.
컨텍스트 콜백: 인수 크기가 잘못된 크기입니다.
오류: CL_INVALID_ARG_SIZE
위치: 호스트/src/main.cpp:91
커널 arg 0을 설정하지 못했습니다.
이 오류는 OpenCL™에 대한 인텔® SDK 18.1 이전 버전에서 이 경우에 나타나지 않았습니다. 서명되지 않은 긴 긴 유형의 크기가 기본 커널 컴파일러에서 8에서 16으로 변경되었지만 호스트 호출 sizeof(서명되지 않은 긴 길이)는 여전히 8을 반환하기 때문에 오류가 나타납니다.
서명/서명되지 않은 긴 형식은 C99 또는 OpenCL™ 버전 1.X에 정의된 크기가 없으므로 호스트와 장치가 유형에 대해 서로 다른 크기를 사용할 수 있습니다. 따라서 커널에 대한 인수 유형으로 사용해서는 안 됩니다. 컴파일러, 장치 또는 컴파일러 버전 간에 휴대성이 보장되지는 않습니다. OpenCL™ 2.0 사양에서 긴 유형은 128비트로 정의되지만 C99 모호성은 남아 있습니다. OpenCL™ 사양은 cl_* 호환성 유형을 추가하지 않으므로 긴 형식을 스칼라 인수로 안전하게 사용할 수 없습니다.
이 문제에 대한 권장 해결 방법은 호스트/장치 코드에서 긴 cl_ulong/서명되지 않은 OpenCL™ 정의 유형을 사용하는 것입니다.
또는 sizeof() 호출을 사용하지 않고 아래와 같이 긴 긴 인수의 크기를 16바이트로 강제합니다.
clSetKernelArg(커널, 0, 16, (void*)&data);