「フェンス」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
10行目: 10行目:
 
フェンスがない時代はGPU自体がアイドル状態(タスク全停止)になるのを待っていました。
 
フェンスがない時代はGPU自体がアイドル状態(タスク全停止)になるのを待っていました。
 
<source lang="csharp">
 
<source lang="csharp">
  gpu.addTask(task1);
+
  gpu.addTask(renderTask);
gpu.addTask(task2);
 
 
  gpu.addTask(computeTask);
 
  gpu.addTask(computeTask);
 
  gpu.waitForIdle();
 
  gpu.waitForIdle();
 
</source>
 
</source>
  
フェンスを使うと「グラフィックスシェーダーはfenceで1フレームごとに止めるけどコンピュートシェーダーは止めないでぶん回す」といったことができます。
+
一方でフェンスを使うと「グラフィックスシェーダーはfenceで1フレームごとに止めるけどコンピュートシェーダーは止めないでぶん回す」といったことができます。
 
<source lang="csharp">
 
<source lang="csharp">
 
  var fence = gpu.createFence();
 
  var fence = gpu.createFence();
  gpu.addTask(task1, fence);
+
  gpu.addTask(renderTask, fence);
gpu.addTask(task2, fence);
 
 
  gpu.addTask(computeTask, null);
 
  gpu.addTask(computeTask, null);
 
  gpu.waitForFence(fence); // task1とtask2の両方が終わるのを待つ
 
  gpu.waitForFence(fence); // task1とtask2の両方が終わるのを待つ

2024年3月10日 (日) 06:48時点における版

フェンス英語: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); // task1とtask2の両方が終わるのを待つ