2012-01-17 2 views
0

Теперь я изучаю OpenCL, и я пытаюсь написать пример «привет мир»; Я создаю платформу, устройство и контекст.for_each данные печати не верны

Теперь я хочу получить информацию об устройстве с устройства, чтобы создать и сохранить информацию в векторе, а затем распечатать их. Для этого я использую clGetDeviceInfo.

Проблема заключается в том, что возвращаемая информация от вызова находится в другом формате, поэтому я пытаюсь написать функцию печати для печати данных, но у меня есть проблема, когда я использую for_each для печати данных. Я могу распечатать большую часть данных, потому что я могу передавать только данные одного типа в функцию печати, а функция печати печатает только данные того же типа. Остальные данные печатаются некорректно.

данные Возвращаемыое clGetDeviceInfo http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html

template <typename t > 
void print (void *data) 
{ 

    boost::any _t = static_cast<t> (data); 
    cout << boost::any_cast<t> (_t) << endl << endl; 
} 

cl_device_info devinfo_list[] = 
{ 
CL_DEVICE_TYPE , 
CL_DEVICE_VENDOR_ID , 
CL_DEVICE_MAX_COMPUTE_UNITS , 
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS , 
CL_DEVICE_MAX_WORK_ITEM_SIZES , 
CL_DEVICE_MAX_WORK_GROUP_SIZE , 
CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR , 
CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, 
CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT , 
CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, 
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, 
CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, 
CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, 
CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR , 
CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, 
CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, 
CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, 
CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, 
CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, 
CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, 
CL_DEVICE_MAX_CLOCK_FREQUENCY , 
CL_DEVICE_ADDRESS_BITS , 
CL_DEVICE_MAX_MEM_ALLOC_SIZE , 
CL_DEVICE_IMAGE_SUPPORT , 
CL_DEVICE_MAX_READ_IMAGE_ARGS , 
CL_DEVICE_MAX_WRITE_IMAGE_ARGS , 
CL_DEVICE_IMAGE2D_MAX_WIDTH , 
CL_DEVICE_IMAGE2D_MAX_HEIGHT , 
CL_DEVICE_IMAGE3D_MAX_WIDTH , 
CL_DEVICE_IMAGE3D_MAX_HEIGHT, 
CL_DEVICE_IMAGE3D_MAX_DEPTH , 
CL_DEVICE_MAX_SAMPLERS , 
CL_DEVICE_MAX_PARAMETER_SIZE , 
CL_DEVICE_MEM_BASE_ADDR_ALIGN , 
CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE , 
CL_DEVICE_SINGLE_FP_CONFIG , 
CL_DEVICE_GLOBAL_MEM_CACHE_TYPE , 
CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE , 
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE , 
CL_DEVICE_GLOBAL_MEM_SIZE , 
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE , 
CL_DEVICE_MAX_CONSTANT_ARGS, 
CL_DEVICE_LOCAL_MEM_TYPE , 
CL_DEVICE_LOCAL_MEM_SIZE ,      
CL_DEVICE_ERROR_CORRECTION_SUPPORT ,   
CL_DEVICE_PROFILING_TIMER_RESOLUTION ,  
CL_DEVICE_ENDIAN_LITTLE ,      
CL_DEVICE_AVAILABLE,       
CL_DEVICE_COMPILER_AVAILABLE,   
CL_DEVICE_EXECUTION_CAPABILITIES ,   
CL_DEVICE_QUEUE_PROPERTIES ,    
CL_DEVICE_NAME ,       
CL_DEVICE_VENDOR ,       
CL_DRIVER_VERSION ,       
CL_DEVICE_PROFILE ,       
CL_DEVICE_VERSION ,       
CL_DEVICE_EXTENSIONS ,      
CL_DEVICE_PLATFORM ,       


}; 

vector<void*> _data; 

size_t h = NULL ; 
    for (unsigned int infos = 0 ; infos<ARRAYSIZE(devinfo_list) ; infos++) 
{ 
    err = ::clGetDeviceInfo (devices[0] ,devinfo_list[infos] ,NULL, NULL ,&h); 
    if (err == 0) 
    { 
     _data.resize (_data.size() + 1); 
     _data.at(_data.size() - 1) = alloca(h); 
    } 

    err = ::clGetDeviceInfo (devices[0] ,devinfo_list[infos], h ,_data.at(_data.size() - 1),NULL); 


} 

for_each (_data.begin() , _data.end() , print<char*>); // the data from char* only print crrectly 
+0

Вы ожидали X, но у вас есть Y. так что X и Y для вас? –

ответ

1

Я прочитал документацию и что функция возвращает результат внутри void*, и вы должны бросить его в любой тип вы ожидали. Я также вижу, что у них есть список типов, возвращаемых различными параметрами.

Я бы решил это так, чтобы у меня не только был список cl_device_info, но и хранить то, какие типы они возвращают, а затем использовать эту информацию для создания. Если вы делаете это с помощью структурного или двухмерного массива, который зависит от вас.

+0

спасибо. ваша идея в точности моя, и я помещаю это решение в нижней части списка, потому что это нецелесообразно, особенно когда у вас есть список из 50 различных типов информации, – user943998

+0

Да, ну, пустота * непрозрачна, и вы не представляете, что скрывается за ней так что это почти единственное решение, которое я имею прямо сейчас. –

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