2

私のグラフィックコースでは、ナイーブラインラスタライズアルゴリズム、次にブレゼンハムのライン描画アルゴリズムを教えられました. コンピューターは整数マシンであると言われたので、整数マシンを使用する必要があります。

  1. ソフトウェア レベルでの最適化がないと仮定すると、これは mmx やその他の命令セットを備えた最新の CPU に当てはまりますか? Intel の 64-ia-32-architectures-optimization-manual.pdf を見たところ、加算減算乗算のレイテンシは、mmx の int と比較して、float で同じかそれ以上です。

  2. アルゴリズムが GPU で実行される場合、これは問題になりますか? NVIDIA CUDA Programming Guide 1.0 (pdf)の 41 ページを確認したところ、int と float のクロック サイクルは同じです。

  3. float を int にキャストすることの非効率性は何ですか? load-hit-store ストールは私たちにとって本当の問題ですか?

  4. 数値を切り上げる/切り下げる関数はどれくらい効率的ですか? (c++ stl での実装を考えることができます)

  5. 内側のループで使用される乗算の代わりに加算により、ブレゼンハム アルゴリズムから得られる効率はありますか?

4

1 に答える 1

2

コンピューターを整数マシンと呼ぶのは少し誤解を招きますが、その意見はほとんど真実です。私の知る限り、CPUは整数レジスタを使用して、読み書きするメモリアドレスを生成します。線画を整数レジスタに保持するということは、線画中にピクセルを書き込むためのメモリ アドレスを生成するために、他のレジスタから整数レジスタにコピーするオーバーヘッドを回避することを意味します。

具体的な質問について:

  1. 汎用レジスタを使用してメモリにアクセスする必要があるため、SSE または FPU を使用してメモリ オフセット (ポインタ) を計算すると、これらのレジスタから汎用レジスタにデータを転送するオーバーヘッドが残ります。したがって、あるレジスタセットから別のレジスタセットへの転送のオーバーヘッドが、特定の命令セットを使用するパフォーマンスよりも大きいかどうかによって異なります。
  2. GPU は統一されたレジスタ セットを持つ傾向があるため、それほど重要ではありません。
  3. float を int にキャストすること自体は高価ではありません。オーバーヘッドは、あるレジスタ セットから別のレジスタ セットにデータを転送することによって発生します。通常、これはメモリを介して行う必要があり、CPU にロード ヒット ストア ペナルティがある場合、この転送はそれらの大きな原因となります。
  4. 切り上げまたは切り下げのパフォーマンスは、CPU とコンパイラに依存します。スローエンドでは、MSVC は関数を使用してゼロに丸め、FPU 制御ワードをいじっていました。高速側では、丸めを直接処理する特別な CPU 命令があります。
  5. Bresenham の線画アルゴリズムは、線上の点を描画する場所の決定を単純なy= m*x + b式から足し算と分岐に減らすため、高速です (分岐は、よく知られている分岐のない整数手法によって削除できます)。Brensenham の線描画アルゴリズムの実行スライス バージョンは、反復するのではなく、同じコンポーネントを持つピクセルの「実行」を直接決定するため、さらに高速になる可能性があります。
于 2011-12-29T03:20:59.363 に答える