Direct3D 11 のマルチスレッドの概要

マルチスレッドとは、1 つ以上のスレッドを同時に使用して処理を実行することでパフォーマンスの向上を目指す手法です。従来のマルチスレッドでは、レンダリングを実行するメイン スレッドを 1 つ生成し、オブジェクトの作成、ロード、処理などの準備作業を実行する 1 つ以上のスレッドを生成することが普通でした。しかし、組み込みの同期機能を備える Direct3D 11 では、プロセッサ間で待機状態が発生しないようにして (特に、GPU の待機はフレーム レートに直接影響します)、すべての CPU サイクルおよび GPU サイクルを有効活用することがマルチスレッドの目標となっています。このような活用によって、最適なフレーム レートを維持しながら、大きな処理量を実現できます。API に同期機能が実装されているため、1 つのフレームのみでレンダリングを構成する概念は不要になりました。

マルチスレッドはなんらかの形の同期を必要とします。その理由は、レンダリング コマンドの処理 (通常は GPU で実行) とレンダリング コマンドの生成 (オブジェクトの作成、データのロード、ステートの変更、データの処理を通じて通常は CPU で実行) では、同じリソース (テクスチャー、シェーダー、パイプライン ステートなど) を使用することが多いからです。複数のスレッド間で処理を適切に調整するには、同期を実行して、1 つのスレッドで変更中のデータを別のスレッドで変更したり、読み取ったりしないようにする必要があります。

Direct3D 11 のランタイムでは、リソース、シェーダー、ステート オブジェクトなどで、シングル スレッド オブジェクトまたはマルチスレッド オブジェクトの作成をサポートしています。また、Direct3D 11 インターフェイスはフリー スレッド化されているため、内部のクリティカル セクションや同期プリミティブをいずれも必要としません。つまり、ランタイムでは、複数のスレッドで同じメソッドを同時に呼び出すことができます。

マルチスレッドのサポートでは、API を次の 2 つの機能領域に分けています。

ランタイムで使用可能なマルチスレッド数は、ドライバーのサポートによって異なります。「方法 :ドライバーのサポートの確認」では、ドライバーの照会と、その結果の意味に関する詳細を示しています。

Direct3D 11 は、マルチスレッドのサポートを基本として設計されています。Direct3D 10 では、デバッグ レイヤーを使用したマルチスレッドの限定的なサポートを導入しています。「Direct3D のバージョン間のスレッドの相違」では、DirectX のこの 2 つのバージョンの動作の相違について説明しています。.

マルチスレッドと DXGI

    ほとんどの DXGI インターフェイス関数は、イミディエイト コンテキストとの同時使用は無効です。2009 年 3 月以降の DX SDK では、安全な DXGI 関数は AddRef, Release, and QueryInterface のみです。

関連項目

マルチスレッド