OpenCL/CPU. 测试 OpenCL 框架是否可用。

5
我正在开发一个混合 OpenCL 应用程序,它必须在运行时决定是否使用 GPU 实现。
有没有一种跨平台(即适用于英特尔、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)...

如果我尝试在上述情况下启动它。

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

提前感谢您。


1
如果你只针对Windows系统,为什么不尝试在程序入口手动加载OpenCL dll呢?如果出现未找到错误,处理它并回退到CPU代码路径。 - talonmies
1个回答

4
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;
}

如果没有安装OpenCL平台,您的代码仍然会显示一切正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接