2012-01-17 37 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