我現在正在學習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
你期望X,但你得到了Y.那麼X和Y對你來說又是什麼? – 2012-01-17 09:31:42