web-dev-qa-db-ja.com

OpenCLとOpenMPのパフォーマンス

OpenCLとOpenMPのパフォーマンスを比較した研究はありますか?具体的には、OpenCLでスレッドを起動する際のオーバーヘッドコストに興味があります。たとえば、ドメインを非常に多数の個別の作業項目(それぞれが小さなジョブを実行するスレッドによって実行される)とOpenMPの重いスレッドに分解した場合、ドメインは、コアの数と同じ数のサブドメインに分解されました。

OpenCLプログラミングモデルは、コア数が少ないが強力なCPUではなく、超並列チップ(GPUなど)をターゲットにしているようです。

OpenCLはOpenMPの効果的な代替品になることができますか?

30
Robert

私が見たベンチマークは、同じハードウェアで実行されているOpenCLとOpenMPのパフォーマンスは通常同等であるか、OpenMPの方がわずかに優れていることを示しています。しかし、それらの方法論の詳細な説明がほとんど欠けているため、決定的なものと考えるベンチマークは見ていません。ただし、考慮すべきいくつかの便利な点があります。

  • OpenCLは、実行時にカーネルをコンパイルするときに常に追加のオーバーヘッドをいくつか持ちます。ベンチマークでは、この時間を個別にリストするか、事前にコンパイルされたネイティブカーネルを使用するか、カーネルのコンパイルが重要でないほど長く実行する必要があります。

  • OpenCLの実装は異なります。 NVidiaのようなGPUベンダーは、CPUベースのOpenCL実装が可能な限り高速であることを確認するインセンティブがありません。どのOpenCL実装も、優れたOpenMP実装ほど成熟していない可能性があります。

  • OpenCL仕様では、CPUベースの実装が内部でどのようにスレッド化を使用するかについては基本的に何も述べられていないため、スレッド化が比較的軽量であるか重量級であるかについての議論は、実装固有です。

  • CPUでOpenCLコードを実行している場合、作業項目は小さくて多数である必要はありません。 OpenMPの場合と同じ方法で問題を解決できます。

OpenCLのオーバーヘッドがもう少し多い場合でも、他の理由で優先する場合があります。

  • 明らかに、コードでGPUをうまく利用できる場合は、OpenCL実装が必要になります。 CPUでのOpenCLのパフォーマンスは十分で、強力なGPUを持たないユーザーのためにOpenMPフォールバックコードパスを維持する価値はありません。

  • 優れたCPUベースのOpenCL実装とは、CPUおよびOpenCL実装がサポートする命令セット拡張の利点を自動的に利用できることを意味します。 OpenMPでは、実行可能ファイルにSSExとAVXの両方のコードパスが含まれていることを確認するために、追加の作業を行う必要があります。

  • OpenCLベクトルプリミティブを使用すると、SSE組み込み関数を使用して移植性と可読性を犠牲にすることなく、明示的な並列処理を表現できます。

26
user57368

私は、いくつかの主要なボトルネックでopenCLまたはopenMPのいずれかを使用するオプションを持つプログラムを持っています。基本的にはベクトルを追加し、削減を実行します。

私の場合、openMPは13秒かかり、openCLはCPUで10秒かかります。 Intel I5。

これまでのところ、私にとって最速の構成は、openCL GPUを使用してベクトルを追加し、openMPを削減して7秒に短縮することです。 openCLカーネルの削減をGPUで実行すると、合計8秒かかります。

だから私の経験から、多分それは使用に依存していると私は言うでしょう、そしてあなたはあなたのopenCLカーネルを最適化することができます。

7
MVTC