0

永続的な GPU 関数を記述できるかどうか疑問に思っています。疑問がありますが、スケジューラーがどのように機能するかわかりません。

不明な数のデータ ポイント (約 5000 万) を処理しようとしています。データは 20 程度のチャンクで到着します。これらの 20 ポイントを GPU の「バケット」にドロップし、この「永続的な」操作でそれらを取得して処理できるようにするとよいでしょう。完了したら、結果を取得します。
バケットが空の間、GPU をダミー データでビジー状態に保つことができます。しかし、部分的に空のバケットでの競合状態が問題になると思います。
この永続的な操作が実行されている間、GPU で他の操作を実行することはできないと思います。つまり、他の専用でない SM を機能させます。

これは実行可能な (fermi) GPU アプローチですか、それとも単に悪い考えですか?

4

1 に答える 1

1

この永続的なカーネルが可能かどうかはわかりませんが、非常に非効率的であることは間違いありません。アイデアは洗練されていますが、GPU には適合しません。どのスレッドがバケットからどの要素を選択するかをグローバルに通信する必要があります。一部のスレッドは、他のスレッドが終了するのを待っているため、開始さえしない可能性があり、バケットは揮発性と宣言されているため、入力データ全体が遅くなります。

問題のより一般的な解決策は、データをチャンクに分割し、そのチャンクを非同期で GPU にコピーすることです。2 つのストリームを使用します。1 つは最後に送信されたチャンクで動作し、もう 1 つはホストから新しいチャンクを送信します。これは実際には同時に行われます。そうすれば、ほとんどの転送を隠すことができます。ただし、チャンクが小さすぎないようにしてください。カーネルの占有率が低下し、パフォーマンスが低下します。

于 2013-02-08T18:34:33.763 に答える