「フェンス」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) |
||
(同じ利用者による、間の9版が非表示) | |||
1行目: | 1行目: | ||
− | '''フェンス'''([[英語]]:fence)とは、[[コマンドキュー]]([[スレッドプール]])に対してコマンド(タスク)と共に投入すると、そのコマンドの処理終了時に[[シグナル状態]]なる(完了フラグが立つ)[[変数]] | + | '''フェンス'''([[英語]]:fence)とは、[[コマンドキュー]]([[スレッドプール]])に対してコマンド(タスク)と共に投入すると、そのコマンドの処理終了時に[[シグナル状態]]なる(完了フラグが立つ)[[変数]]のことです。 |
− | + | フェンスを監視することでコマンドの終了を待ち受けることができます。 | |
+ | |||
+ | |||
+ | |||
+ | 大雑把にいうと[[CPU]]での[[マルチスレッド]]や[[GPU]]での並列処理などで複数のタスクの終了を待つ(同期する)ための目印です。 | ||
+ | |||
+ | たとえば[[ゲーム]]で1フレームごとに[[マルチスレッド]]を止めたい場合があるとします。 | ||
+ | フェンスがない時代はGPU自体がアイドル状態(タスク全停止)になるのを待っていました。 | ||
+ | <source lang="csharp"> | ||
+ | gpu.addTask(renderTask); | ||
+ | gpu.addTask(computeTask); | ||
+ | gpu.waitForIdle(); | ||
+ | </source> | ||
+ | |||
+ | 一方でフェンスを使うと「グラフィックスシェーダーはfenceで1フレームごとに止めるけどコンピュートシェーダーは止めないでぶん回す」といったことができます。 | ||
+ | <source lang="csharp"> | ||
+ | var fence = gpu.createFence(); | ||
+ | gpu.addTask(renderTask, fence); | ||
+ | gpu.addTask(computeTask, null); | ||
+ | gpu.waitForFence(fence); // renderTaskが終わるのを待つ | ||
+ | </source> | ||
+ | |||
+ | [[category: GPU]] |
2024年3月10日 (日) 06:49時点における最新版
フェンス(英語:fence)とは、コマンドキュー(スレッドプール)に対してコマンド(タスク)と共に投入すると、そのコマンドの処理終了時にシグナル状態なる(完了フラグが立つ)変数のことです。
フェンスを監視することでコマンドの終了を待ち受けることができます。
大雑把にいうとCPUでのマルチスレッドやGPUでの並列処理などで複数のタスクの終了を待つ(同期する)ための目印です。
たとえばゲームで1フレームごとにマルチスレッドを止めたい場合があるとします。 フェンスがない時代はGPU自体がアイドル状態(タスク全停止)になるのを待っていました。
gpu.addTask(renderTask);
gpu.addTask(computeTask);
gpu.waitForIdle();
一方でフェンスを使うと「グラフィックスシェーダーはfenceで1フレームごとに止めるけどコンピュートシェーダーは止めないでぶん回す」といったことができます。
var fence = gpu.createFence();
gpu.addTask(renderTask, fence);
gpu.addTask(computeTask, null);
gpu.waitForFence(fence); // renderTaskが終わるのを待つ