5

GPU 実装を使用するかどうかを実行時に決定する必要があるハイブリッド OpenCL アプリケーションに取り組んでいます。

アプリケーションをクラッシュさせずに、アプリケーションが実行されているコンピューターが opencl フレームワークをサポートしているかどうかを判断するためのクロスプラットフォーム (つまり、インテル、nvidia、および ati の場合) の方法はありますか? 最初は、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 をテストしたところ、正しく動作しました。「opencl.dll」形式の Windows/System フォルダをアプリケーション フォルダにコピーするだけで済みます。同じ状況でアプリがクラッシュする理由がわかりません。

前もって感謝します。

4

1 に答える 1

4

これOpenCL.dllはすべての実装で同じであるため、@talonmies が提案したように手動でライブラリをロードする代わりに (これはより優れていますが、より複雑です)、ライブラリを 1 つ持ち運ぶことができます。インストールされたプラットフォームにアクセスするためのインターフェイスを提供するだけです。

プラットフォームがインストールされているかどうかを確認するには、次を使用する必要があります

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プラットフォームがインストールされていなくても、コードはすべて問題ないと言うからです

于 2012-05-11T15:11:15.997 に答える