2012-05-11 59 views
3

我正在研究混合OpenCL应用程序,它必须在运行时决定是否使用GPU实现。OpenCL/CPU。测试OpenCL框架是否可用

是否有跨平台(即英特尔,nvidia和ati)的方式来剥离,运行应用程序的计算机是否具有opencl框架支持,而不会崩溃应用程序?一开始我只为Windows平台开发。

#include <CL/cl.h> 
#include <iostream> 

int main() 
{ 
    std::cout << "Start cross paltform testing" << std::endl; 
    cl_platform_id platform[1]; 
    clGetPlatformIDs(1, platform, 0); 
    std::cout << "End cross paltform testing" << std::endl; 
    return 0; 
} 

目前我得到的错误:

The application was unable to start correctly (0xc000007b)... 

,如果我尝试在我上面描述的情况来启动它。

注: 实际上,至少对于nvidia来说应该是可以的。在这种情况下,我已经从nvidia GPU SDK测试了oclDeviceQuery并且它可以正常工作。只需将Windows/System文件夹中的“opencl.dll”复制到应用程序文件夹中即可。我不知道为什么我的应用程序在相同的情况下崩溃。

预先感谢您。

+1

如果你只靶向窗户里没有的OpenCL平台,你不能尝试在入口处手动加载OpenCL dll。如果你得到一个未发现的错误,处理它并回复给你CPU代码路径。 – talonmies

回答

3

OpenCL.dll对于所有的实现都是一样的,所以不是像@talonmies建议的那样手动加载库(这更好但更复杂),你可以随身携带一个库。它只是提供一个访问已安装平台的界面。

要检查是否有安装在任何平台上,你应该使用

int main() 
{ 
    std::cout << "Start cross paltform testing" << std::endl; 
    int num_platforms; 
    cl_platform_id *platform; 
    clGetPlatformIDs(0, NULL, &num_platforms); 
    std::cout << "End cross paltform testing: " << num_platforms << " found" << std::endl; 
    // Get platform IDs (not necessary right now, for future use) 
    platform = new cl_platform_id[num_platforms]; 
    clGetPlatformIDs(num_platforms, platform, NULL); 
    // ........ 
    delete platform; 
    return 0; 
} 

,因为你的代码会说一切正常,即使没有安装

+0

工作即编译代码版本:http://pastebin.com/54NLhwni – LonliLokli