for_each打印数据不正确
for_each print data not correct
我现在正在学习OpenCL,我正在尝试写一个"你好世界"的例子;我创建平台、设备和上下文。
现在我想从设备中获取设备信息,以便在矢量中创建和保存信息,然后打印它们。为此,我使用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
我阅读了文档,该函数在void*
中返回结果,您必须将其强制转换为您期望的任何类型。我还看到它们有一个由不同参数返回的类型列表。
我会解决这个问题,这样我不仅会有一个cl_device_info
的列表,还会存储它们返回的类型,然后使用这些信息进行强制转换。如果你用一个结构或二维数组来做这件事,那就由你自己决定了。
相关文章:
- 如果用户不小心给出了不正确的数据类型,cin 如何工作?
- ctypes - 结构包含垃圾/不正确的数据
- 读取来自提升binary_iarchive不正确的数据
- C++/WinRT 数据 不正确的数据封送处理
- 尝试使用 ifstream 读取数据后显示不正确的数字
- 更改CV_32FC1以CV_64FC1导致不正确的数据转换
- 逐行从文件读取到矢量对于<T>二进制数据C++不正确
- C 从文件中读取FSTREAM数据不会返回正确的值.inputfile.tellg返回-1
- 排序向量不断修改数据并打印不正确的结果
- Winsock recv() 返回不正确的数据
- 从分层窗口获取 HBITMAP - 数据不正确
- 为什么TCP套接字在接收到不正确的ACK时发送RST数据包而不是重新发送数据
- 报告描述符和报告数据结构不正确
- 使用C++(基于C#程序)保存wav文件时,音频数据不正确
- ZigBee Arduino,解析的数据不正确
- .wav C++数据输出不正确
- 当JPEG数据不正确时,libjpeg解码崩溃
- 写入和读取 bin 文件数据不正确
- 数据C++的二进制表示显示的数据不正确
- for_each打印数据不正确