gpt4 book ai didi

c++ - for_each 打印数据不正确

转载 作者:行者123 更新时间:2023-11-28 08:11:46 26 4
gpt4 key购买 nike

我现在正在学习 OpenCL,并且正在尝试编写一个“hello world”示例;我创建平台、设备和环境。

现在我想从设备获取设备信息,以便我创建信息并将其保存在 vector 中,然后打印它们。为此,我使用了 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 的列表,还会存储它们返回的类型,然后使用该信息进行转换。如果您使用由您决定的结构或二维数组来执行此操作。

关于c++ - for_each 打印数据不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8891614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com