2013-06-21 3 views
3

Прямо сейчас я дважды вызываю clGetPlatformInfo. Первый раз получить размер результата, а второй - получить результат. Если я хочу получить 20 частей информации, это означает, что я должен позвонить 40 раз (80 строк кода). Есть ли лучший способ сделать это?Каков правильный способ вызова clGetPlatformInfo?

clGetPlatformInfo Пример

char *profile = NULL; 
    size_t size; 
    clGetPlatformInfo(platforms[0], CL_PLATFORM_PROFILE, NULL, profile, &size); // get size of profile char array 
    profile = (char*)malloc(size); 
    clGetPlatformInfo(platforms[0], CL_PLATFORM_PROFILE,size, profile, NULL); // get profile char array 
    cout << profile << endl; 

clGetDeviceInfo Пример

size_t size; 
char *vendor = NULL; 
clGetDeviceInfo(devices[0], CL_DEVICE_VENDOR, NULL, NULL, &size); 
vendor = (char*)malloc(sizeof(char)*size); 
clGetDeviceInfo(devices[0], CL_DEVICE_VENDOR, size, vendor, NULL); 
cout << vendor << endl; 
+0

Вы всегда должны позвонить clGetDeviceInfo дважды? Как только получить размер, и в другое время получить параметр-val (учитывая размер)? –

ответ

5

Нет, что является правильным способом для использования функции clGetPlatformInfo(). Размер возвращаемой строки известен только во время выполнения.

Для других (например, clGetDeviceInfo() с CL_DEVICE_MAX_COMPUTE_UNITS) вы должны были бы только вызвать функцию один раз, как вы уже знаете (во время компиляции) размер выхода (sizeof(cl_uint)).

7

Может быть, немного поздно, но ... Я предлагаю что-то вроде ... const char * attributeNames [5] = {"Имя", "Поставщик", "Версия", "Профиль", "Расширения"} ;

const cl_platform_info attributeTypes[5] = { 
    CL_PLATFORM_NAME, 
              CL_PLATFORM_VENDOR, 
              CL_PLATFORM_VERSION, 
              CL_PLATFORM_PROFILE, 
              CL_PLATFORM_EXTENSIONS }; 

..то петля через ...

// для каждой платформы печати все атрибуты Е ("\ nAttribute Count =% D", AttributeCount); для (I = 0; я < platformCount, я ++) {

printf("\nPlatform - %d\n ", i+1); 

    for (j = 0; j < attributeCount; j++) { 

     // get platform attribute value size 
     clGetPlatformInfo(platforms[i], attributeTypes[j], 0, NULL, &infoSize); 
     info = (char*) malloc(infoSize); 

     // get platform attribute value 
     clGetPlatformInfo(platforms[i], attributeTypes[j], infoSize, info, NULL); 

     printf(" %d.%d %-11s: %s\n", i+1, j+1, attributeNames[j], info); 
    } 
    printf("\n\n"); 
} 
+0

Если кто-то заинтересован в полной реализации https://github.com/yohanesgultom/parallel-programming-assignment/blob/master/PR2/opencl/device_query.c –

Смежные вопросы