2013-12-10 90 views
1

我目前正在爲OpenCL內核編寫一些unittests,並需要創建一個上下文。 因爲我不是在性能之後,對我來說哪個設備運行內核並不重要。 所以我想創建儘可能少的限制,可能和這個代碼的思想背景:在任何平臺/設備上創建上下文

#define __CL_ENABLE_EXCEPTIONS 
#include <CL/cl.hpp> 
#include <iostream> 

int main() { 
    try { 
    cl::Context context(CL_DEVICE_TYPE_ALL); 
    }catch(const cl::Error &err) { 
    std::cerr << "Caught cl::Error (" << err.what() << "): " << err.err() << "\n"; 
    } 
} 

它返回

陷入CL ::錯誤(clCreateContextFromType):-32

-32是CL_INVALID_PLATFORM和clCreateContextFromType的文檔說:

CL_INVALID_PLATFORM如果屬性爲NULL並且不能選擇平臺或者如果屬性中指定的平臺值不是有效的平臺。

由於我沒有提供任何屬性,他們當然是NULL。 爲什麼不能選擇任何平臺?

我也試過CL_DEVICE_TYPE_DEFAULT,結果相同。

這裏檢測到的我的平臺和設備的列表:

NVIDIA CUDA 
     (GPU) GeForce GTX 560 

作爲一個邊節點:指定平臺,在性能可以作爲intented。

+0

如果有的話,你可以使用Boost.Compute這將使本作簡單爲'boost :: compute :: system :: default_context()'。 –

+0

@KyleLutz:我不知道Boost.Compute,但它似乎還不是官方的Boost庫。因此,它是禁止的。另外:它是否直接映射到OpenCL?我有一些預先存在的內核需要測試,重寫是不可行的。 – Nobody

+0

雖然尚未(官方增強庫),但它只是頭文件,並且易於放入(除了boost頭文件和OpenCL之外,沒有其他依賴文件)。它確實有一個核心API,它是OpenCL C API的一個非常簡單的C++包裝器,並允許您使用現有的OpenCL內核。 –

回答

0

cl::Context context(cl_device_type)正在呼叫使用缺省參數的完整構造:

cl::Context::Context(cl_device_type  type, 
        cl_context_properties * properties = NULL, 
        void(CL_CALLBACK *notifyFptr)(const char *,const void *,::size_t,void *) = NULL, 
        void *  data = NULL, 
        cl_int * err = NULL 
) 

女巫僅僅是一個對底層clCreateContextFromType()的C++包裝。

該函數允許將NULL指針作爲屬性傳遞,但平臺選擇依賴於實現。它看起來像你的情況,它不默認nVIDIA平臺。

你將不得不通過一些信息給構造恐怕....

+0

這聽起來似乎合理。然而,由於「平臺選擇」聽起來好像平臺將從可用平臺列表中選擇,所以它有點令人不滿意。 – Nobody

1

我想你的代碼,使用CL_DEVICE_TYPE_ALL和它的工作對我的設置。我不知道爲什麼它不工作對你的...

作爲一種變通方法,也許你可以做這樣的事情:

// Get all available platforms 
std::vector<cl::Platform> platforms; 
cl::Platform::get(&platforms); 

// Pick the first and get all available devices 
std::vector<cl::Device> devices; 
platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &devices); 

// Create a context on the first device, whatever it is 
cl::Context context(devices[0]); 
+0

正如我在問題中所指出的,我想避免這種情況。事實上,我的代碼在您的網站工作給了我希望,我只需要重新安裝/更新libOpenCL或一些驅動程序再次獲得工作狀態。 – Nobody

相關問題