2011-09-20 4 views
2

짧은 버전 : CL_PLATFORM_VENDOR과 같은 문자열의 크기를 쿼리하는 공식/올바른 방법이 있습니까?clGetPlatformInfo (및 friends)를 사용하여 문자열 길이를 쿼리하는 방법은 무엇입니까?

긴 버전 : 는 오픈 CL의 기능을 보면은 clGetPlatformInfo처럼 나는 결과에 할당하는 방법을 많은 공간을 발견하고 싶다. 기능이 서명이 :

cl_int clGetPlatformInfo(cl_platform_id platform, 
    cl_platform_info param_name, 
    size_t param_value_size, 
    void *param_value, 
    size_t *param_value_size_ret) 

는 문서 말 :

param_value_size 

Specifies the size in bytes of memory pointed to by 
param_value. This size in bytes must be greater 
than or equal to size of return type specified in the 
table below. 

모든 반환 형식의이 char[]으로 나열됩니다. 내가 기대했던대로

size_t size = 0; 
    l_success = clGetPlatformInfo(platform_id, 
           CL_PLATFORM_VENDOR, 0, NULL, &size); 

    if(l_success != CL_SUCCESS) 
    { 
    printf("Failed getting vendor name size.\n"); 
    return -1; 
    } 
    printf("l_success = %d, size = %d\n", l_success, size); 
    char* vendor = NULL; 
    vendor = malloc(size); 
    if(vendor) 
    { 
    l_success = clGetPlatformInfo(platform_id, 
            CL_PLATFORM_VENDOR, size, vendor, &size); 
    if(l_success != CL_SUCCESS) 
    { 
     printf("Failed getting vendor name.\n"); 
     return -1; 
    } 
    printf("Vendor name is '%s', length is %d\n", vendor, strlen(vendor)); 
    } else { 
    printf("malloc failed.\n"); 
    return -1; 
    } 
그것은 행동

: 나는 param_value_size_ret에서 올바른 크기의 수익을 얻을 수 있었으면, 그래서 내가 param_value_sizeparam_value에 대한 NULL에 대한 0을 통과 곳,처럼 전화 예약 얼마나 많은 공간이 알고 싶어 , "NVIDIA Corporation"(null terminator가 포함 된 크기) 및 strlen 반환 값은 19의 크기를 반환합니다.이 값은 매개 변수 크기를 쿼리하는 "올바른"방법입니까 아니면 내 공급 업체의 구현에 대해 운이 좋았습니까? 이 관용구를 본 사람이 벤더에서 실패한 적이 있습니까?

편집 : 나를 트립되는 비트가 이것이다, "바이트이 크기보다 크거나 반환 형식의 크기와 동일해야합니다", 내가 0NULL 호출이 있기 때문에 실패를 통과 할 때처럼 보인다 이는 반환 된 의 크기보다 크거나 같지 않습니다. 나는 왜 그들이 "반환 유형"을 말하는지 잘 모르겠다.

답변

4

예, 바로 입니다. same doc you've mentioned에서

: NULL입니다

param_value 경우에는 무시됩니다.

반환 CL_SUCCESS 함수가 성공적으로 실행되는 경우 :

그리고 아래

. 그렇지 않으면 다음 반환

을 ...

CL_INVALID_VALUEparam_name가 지원되는 값 중 하나가 아니거나 param_value_size로 지정된 바이트 크기는 반환 형식과 param_value의 크기보다 작은 경우 NULL 값이 아닌 경우 .

따라서 명시 적으로 명시되지 않은 경우에도 param_value이 NULL이면 오류가 발생하지 않아야 코드가 올바르게 작동합니다.

다음은 Khronos OpenCL C++ bindings (specs)의 코드입니다.그들도 이런 식으로 할, 그리고 그것이 "공식적인"로 계산 생각 :

// Specialized GetInfoHelper for STRING_CLASS params 
template <typename Func> 
struct GetInfoHelper<Func, STRING_CLASS> 
{ 
    static cl_int get(Func f, cl_uint name, STRING_CLASS* param) 
    { 
     ::size_t required; 
     cl_int err = f(name, 0, NULL, &required); 
     if (err != CL_SUCCESS) { 
      return err; 
     } 

     char* value = (char*) alloca(required); 
     err = f(name, required, value, NULL); 
     if (err != CL_SUCCESS) { 
      return err; 
     } 

     *param = value; 
     return CL_SUCCESS; 
    } 
}; 
+0

위대한 답변! 매우 감사. Khronos 예제를 그리는 것이 도움이된다고 생각합니다. –

1

참고 값을 요구하면서, 네 번째 매개 변수가 NULL이어야하는 예에. 그렇지 않으면 일부 플랫폼이 CL_INVALID_VALUE를 반환합니다.

upfront 쿼리와 malloc이 어떻게 든 위에 있기 때문에 해결 방법으로 하나의 큰 char 버퍼를 사용합니다.

char vendor[10240]; 
l_success = clGetPlatformInfo(platform_id, 
        CL_PLATFORM_VENDOR, sizeof(vendor), vendor, NULL); 
관련 문제