2017-11-13 7 views
0

CPU(localhostホスト)と接続されているポータブルデバイス(USBのようなもの)にいくつかのスレッドを実行したい。さまざまなデバイスに並列スレッドを生成するにはどうすればよいですか?

私はOpenCLが並列化をサポートしていることは知っていますが、OpenCLを使用してポータブルデバイスに作業を配布するにはどうすればよいですか?

OpenCL以外でこれを行う他のアイデアも役に立ちます。

+1

「ポータブルデバイス」とはどういう意味ですか?これはどんなデバイスですか?それはOpenCLの実装を持っていますか? – pmdj

+1

システム内のすべてのOpenCLプラットフォームと各プラットフォーム内のすべてのデバイスを列挙してから、使用するデバイスのカーネル(おそらく異なるバージョン)をコンパイルし、それらのデバイスに作業をキューイングします。プログラムは、ワークロードを使用するすべてのデバイスに分散させるためのロジックを明示的に実装する必要があります。 –

答えて

0

OpenCLタスクを実行する可能性のあるデバイスには、インストール可能なクライアントドライバが関連付けられている必要があります。インストール可能なクライアントドライバは、該当するコンピュータのOpenCLドライバによって取得できます。グラフィックスカードは、ドライバが最新のものであれば、有効なICDがあることがほぼ保証されており、多くのコンシューマレベルのCPUはドライバによって提供されるICDを持っています。

しかし、ネットワークデバイスやUSBデバイスのような他のデバイスは、異種コンピューティングシステムで使用するために特別に設計されていない限り、有効なICDを持つことがかなり少なくなります。 彼らは有効なICDを持っている場合は、それはそれにあなたが正常にOpenCLを使用したいのと同じ方法を使用して、実行時にそのプラットフォームを照会して、OpenCLのコンテキストを作成するときに使用するためにそれを選ぶの単なる問題です:

//C++ OpenCL API 
cl::Platform target_platform; 
std::vector<cl::Platform> platforms; 
cl::Platform::get(&platforms); 
for(cl::Platform & platform : platforms) { 
    std::string name = platform.getInfo<CL_PLATFORM_NAME>(); 
    if(name == /*Whatever the Name of the platform is*/) { 
     target_platform = platform; 
     break; 
    } 
} 
std::vector<cl::Device> devices; 
target_platform.getDevices(CL_DEVICE_TYPE_ALL, &devices); 
cl::Device target_device; 
for(cl::Device & device : devices) { 
    if(device.getInfo</*...*/>() == /*...*/) {//Whatever properties you need 
     target_device = device; 
     break; 
    } 
} 
+0

有効なICDがない場合はどうなりますか?その場合、そのデバイス用の有効なICDを作成するにはどうすればよいですか? – Jatin

+0

@Jatinこれは、デバイスの製造元が作成するものです。数千時間をかけてデバイスのデータシートを勉強し、そのためのドライバを構築する方法を検討していない限り、 ;)あなたが使用しているドライバは最新ではないかもしれないことに注意してください:最新バージョンを使用していることを確認してください。 – Xirema

関連する問題