문서 ID: 000086479 콘텐츠 형태: 문제 해결 마지막 검토일: 2018-12-13

호스트 코드에서 OpenCL™ 커널 인수로 긴 형식을 사용할 때 "CL_INVALID_ARG_SIZE" 오류가 발생합니까?

환경

  • 인텔® Quartus® Prime Standard Edition
  • 인텔® Quartus® Prime Pro Edition
  • OpenCL™용 인텔® FPGA SDK
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    설명

    아래와 같이 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);

    관련 제품

    이 문서는 다음 항목에 적용됩니다. 1 제품

    인텔® 프로그래밍 가능 장치

    이 페이지의 콘텐츠는 원본 영어 콘텐츠에 대한 사람 번역 및 컴퓨터 번역의 조합으로 완성되었습니다. 이 콘텐츠는 편의와 일반적인 정보 제공을 위해서만 제공되었으며, 완전하거나 정확한 것으로 간주되어선 안 됩니다. 이 페이지의 영어 버전과 번역 간 모순이 있는 경우, 영어 버전이 우선적으로 적용됩니다. 이 페이지의 영어 버전을 확인하십시오.