整数オペレイテンシは決してデータに依存しないため、初期化されていない値では全く問題がありません。浮動小数点は異なります。一部のFPUは、非正規化、NaN、および無限大(ベクトル要素のいずれか1つ)で減速します。
インテルNehalem以前は、正規表現入出力を使用して数学演算を実行しているとき、およびFPアンダーフロー/オーバーフロー時に多くの速度が低下します。 Sandybridgeには、すべての入力に対して(Agner Fog's instruction tablesによる)高速加算/減算付きの素敵なFPUがありますが、multiply can still slow downです。
追加/サブ/乗算は0で問題ありませんが、NaNなどを表す初期化されていない迷惑メールの問題が発生する可能性があります。
0で除算しない除算には注意してください。これにより、HWの設定に応じてFPU例外が発生する可能性があります。
はい、使用されていない要素をゼロに保つことは、おそらく良い考えです。最初に物事をどのように生成するかによって、これはかなり安いかもしれません。 (例えば、movd/pinsrd/pinsrd(またはinsertps)を使用して、3つの32ビット要素をベクトルに入れて、最初のmovdで96bをゼロにします)。
青いチャネルの2番目のコピーを4番目の素子。 (またはそこにシャッフルするのが最も便利なもの)movsldup
(SSE3)/ movlps
というベクトルをロードできます。 movsldup
の後、あなたの登録簿は{ b b r r }
を保持するでしょう。 movlps
は下位64ビットを再ロードするので、{ b b g r }
になります。 (これは、movsd
、BTWと同等です)。シャッフルポートが負荷ポートよりビジーでない場合は、1つの16Bロードを実行してshufpsします。 (Intel CPU上のmovsldup
は、重複が組み込まれていても、ロードポートで実行される単一のuopです)。
もう1つの方法は、16Bの負荷で1つのコンポーネント次のピクセルのあなたがやっていることに応じて、次のピクセルの1つの要素を壊すようなオーバーラップするストアは、問題ないかもしれません。電流を保存する前に次のピクセルをロードすると、いくつかのオペレーションでそれを回避することができます。キャッシュや帯域幅制限が非常に簡単なので、時折キャッシュライン分割ロード/ストアのわずかなコストで1/4スペースを節約する価値があります。
厳密には準拠していないため、「valgrind」や「アドレスサニタイザー」などのツールは不平を言う可能性があります。私はこれが実際にはうまくいかない理由は何も見ません。 – EOF
@EOF:FPデータには技術的な理由があります:FP例外、および初期化されていないデータがNaN、無限大、または非正規の浮動小数点を表す場合、CPUによっては大きなパフォーマンス上の不利益があります。 –
このような大きな精度をカラーチャンネルに使用したい理由はありますか?ストレージについては、代わりにハーフフロートを使用することがありますが、処理についてはわかりません –