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

OpenCL/CPU。测试OpenCL框架是否可用,opencl,nvidia,hybrid,ati,Opencl,Nvidia,Hybrid,Ati,我正在开发一个混合OpenCL应用程序,它必须在运行时决定是否使用GPU实现 是否有跨平台(即intel、nvidia和ati)的dermine方法,运行应用程序的计算机是否支持opencl框架,而不会导致应用程序崩溃?开始时,我只是为Windows平台开发 #include <CL/cl.h> #include <iostream> int main() { std::cout << "Start cross paltform testing"

我正在开发一个混合OpenCL应用程序,它必须在运行时决定是否使用GPU实现

是否有跨平台(即intel、nvidia和ati)的dermine方法,运行应用程序的计算机是否支持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;
}
如果我尝试在上面描述的情况下启动它

注意: 事实上,至少对于英伟达来说,应该是可能的。我已经在这个场景中测试了英伟达GPU SDK的OCKDEVICE,它工作正常。只需将“opencl.dll”窗体Windows/System文件夹复制到应用程序文件夹中即可。我不知道为什么我的应用程序会在同样的情况下崩溃


提前谢谢。

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;
}
intmain()
{

std::cout如果您只是针对windows,您不能尝试在条目处手动加载OpenCL dll。如果您遇到找不到的错误,请处理它并还原到您的CPU代码路径。
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;
}