2017-11-08 7 views
1

빌드가 -11 오류를 반환합니다. 펑션 함수를 삭제하면 잘 컴파일됩니다. 임베디드 프로필을 사용하고 있지 않습니다.OpenCL에서 Math 기본 제공 함수를 사용할 수없는 이유는 무엇일까요? 일부 지시어를 사용해야합니까?

__kernel void VectorAdd(__global int* a) 
{ 
    unsigned int n = get_global_id(0); 
    a[n] = pow(2, 2); 
} 

임 오류를 잡기하지만 문자열이 비어

int err = clBuildProgram(OpenCLProgram, 0, NULL, NULL, NULL, NULL); 
if (err != CL_SUCCESS) 
{ 
    size_t len; 
    char buffer[2048];     
    printf("Error: Failed to build program executable!\n"); 
    clGetProgramBuildInfo(OpenCLProgram, cdDevice, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len); 
    printf("%s\n", buffer); 
    exit(1); 
} 

유용한 정보 :
CL_DEVICE_NAME : AMD 라데온 HD - 파이어 D300 계산 엔진
CL_DRIVER_VERSION : 1.2 (2017년 1월 10일 22 : 25:08)

답변

0
  1. 무엇합니까 clGetProgramBuildInfo()PARAM_NAME와 = CL_PROGRAM_BUILD_LOG? 이렇게하면 훨씬 자세한 오류 메시지가 나타납니다. 이 질문을 업데이트하면이 대답을 확장 할 수 있습니다.
  2. OpenCL의 버전은 무엇입니까? 1.2 이전에는 pow() 함수가 부동 소수점 유형에 대해서만 정의되었습니다. 정수로 작업 할 것으로 기대하고 있습니다.
+0

문제가 정수와 함께 발생했습니다. 나는 2.0으로 바뀌고 작동 중이다. 정수에는 사용할 수 없습니까? – Eduardo

+0

@Eduardo buildinfo 문자열이 비어 있으면 필요한 길이를 확인하고 버퍼를 동적으로 할당하십시오. 2048 바이트 버퍼가 충분히 클 수 없습니다. – pmdj

+0

다른 버전의 pow가 있습니다. 지수가 정수인 경우'pown()'을 사용할 수 있지만 첫 번째 인수는 부동 소수점 값이어야합니다. – kanna

4

OpenCL documentation for pow을 보면 gentype pow(gentype x, gentype y)으로 정의됩니다. 이 문서는 또한

일반적인 유형 이름 gentype이 기능으로 플로트, float2, float3, float4, float8, float16과, 더블, double2, double3, double4, double8, 또는 double16를 취할 수 있음을 나타 내기 위해 사용되는 것을 말한다 인수의 형태

그래서 pow() 이들 두 floatdouble 값 또는 경로를 취하고 동일한 타입의 값을 반환한다. 컴파일러는 pow(2.0, 2.0) (배정 밀도) 또는 pow(2.0f, 2.0f) (단 정밀도)을 호출하기를 원하기 때문에 오류가 발생합니다.

지수 (예 : pown(2.0f, 2))에 대해 정수 값을 취하는 유사한 이름의 함수 float pown(float x, int y)이 있으며이 경우의 최적화 된 구현을 제공 할 수 있습니다.