2016-08-04 13 views
1

私はkhronos.orgでPipe API pagesを通じてOpenCLの2.xのパイプAPIおよび有鉛のthis descriptionを読みました。私は、OpenCLでのみ利用できるこの素晴らしい機能のCUDAでの仕事に嫉妬を感じました(そして、CUDAの機能はOpenCLによって正しく組み込まれていませんが、それは別の問題です)。 CUDAにはパイプ機構がありません」しかし、その後、私はそれが正確に何を意味するのか分からないことに気付きました。代わりに、私は質問します:OpenCL 2.xパイプ - 実際にどのように機能しますか?

  1. AMD離散GPU/APUでのOpenCLパイプの動作はどうですか?書き込まれますどのような情報...

    • パイプを使用してカーネルワークグループのコアへのスケジューリングはどのように行われますか?
    • パイプカーネルは一緒にコンパイルされますか(SPIRフォームなど)?
    • パイプの使用はコア固有のキャッシュ(OpenCLの用語で「ローカルメモリ」、CUDA用語で「共有メモリ」)を介して異なるカーネルの間でデータを渡すことはできますか。それは素晴らしいだろう。
  2. パイプは、一般的に、GPU上で動作するように、「はず」されている方法はありますか?すなわち、APIの作者が構想した、あるいは書いたことさえあるものは?
  3. OpenCLパイプはCPUベースのOpenCL実装でどのように機能しますか?

答えて

2

OpenCLのパイプはOpenCLの2.0と一緒に導入しました。 GPUでは、OpenCLパイプは、アクセス制御されたグローバルメモリバッファのようなものです。つまり、パイプへの書き込み/読み取りを同時に許可するワークグループの数を制限することができます。この種の方法では、複数のワークグループからの読み取りや書き込みの競合を心配することなく、同じバッファやパイプを再利用することができます。私が知る限り、OpenCLパイプはGPUローカルメモリを使用しません。しかし、パイプのサイズを注意深く調整すると、キャッシュヒットが増え、全体的なパフォーマンスが向上します。パイプの使用時期に関する一般的なルールはありません。私は2つの同時実行中のカーネル間でパイプを使ってデータを渡すので、キャッシュヒット率が向上してプログラム全体のパフォーマンスが向上します。これは、OpenCLパイプもCPUで動作するのと同じ方法です(十分小さければシステムキャッシュに収まるかもしれない単なるグローバルバッファです)。しかし、FPGAのようなデバイスでは、別の方法で動作します。パイプは、これらのデバイス内のグローバルメモリの代わりにローカルメモリを使用し、したがって、グローバルメモリバッファを使用することよりもかなり高い性能を達成する。

+0

私はCUDAにパイプをエミュレートするグローバルバッファ、予約バッファ、およびアトミックとかなり些細であることを追加します。また、私はAMDのパイプは予約バッファのためにローカルメモリを使用すると信じています。 –

+0

@JohnsPaul: "キャッシュヒット率の向上" - L2キャッシュまたはコア固有のL1キャッシュを意味しますか?そして、AMDのGPUやそのドライバは、L1キャッシュを利用するために、他のコアのコンシューマよりも前にパイプデータを作成した同じコアのパイプコンシューマを「優先」にすることができますか? – einpoklum

+0

@AndreasPapadopoulos:1.アトミックを使用した同期のためにパフォーマンスを犠牲にすることは避けてください。 2.予約バッファにローカルメモリを使用すると、異なるコアのワークグループが予約を行う必要があります。 – einpoklum

関連する問題