2012-01-17 119 views
0

我现在正在学习OpenCL,并试图编写一个“hello world”示例;我创建平台,设备和上下文。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对你来说又是什么? – 2012-01-17 09:31:42

回答

1

返回的数据我阅读文档和函数返回一个void*内的结果,你必须将其转换为任何类型的您所期望。我也看到他们有不同参数返回的类型列表。

我会这样解决这个问题,我不仅要有cl_device_info的列表,还要存储他们返回的类型,然后使用该信息来进行演员表演。如果你用一个由你自己决定的结构或二维数组来完成它。

+0

谢谢。你的想法完全是我的,我把这个解决方案放在列表的底部,因为它是不切实际的,特别是当你有一个50种不同的信息类型列表, – user943998 2012-01-17 13:14:59

+0

是的,以及void *是不透明的,你不知道隐藏在它后面的是什么所以它几乎是我现在唯一的解决方案。 – 2012-01-17 13:19:02