данные печати for_each неверны - PullRequest
0 голосов
/ 17 января 2012

Сейчас я изучаю OpenCL и пытаюсь написать пример "Hello World"; Я создаю платформу, устройство и контекст.

Теперь я хочу получить информацию об устройстве с устройства, чтобы создать и сохранить информацию в векторе, а затем распечатать их. Для этого я использую 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

1 Ответ

1 голос
/ 17 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...