sseとmmxの命令セットを調べましたが、3チャンネルの画像処理の命令はありません。もちろん、多くの操作では、2つの画像を平均化するなど、同じ手順を使用できます。しかし、チャネルのシャッフルを解除したり、線形変換によって異なるチャネルをミキシングしたりするような操作に関しては、32ビット画像を使用する方がはるかに簡単なようです。
24ビット画像と32ビット画像を使用した一般的な画像処理タスクのパフォーマンス特性はどうですか?
sseとmmxの命令セットを調べましたが、3チャンネルの画像処理の命令はありません。もちろん、多くの操作では、2つの画像を平均化するなど、同じ手順を使用できます。しかし、チャネルのシャッフルを解除したり、線形変換によって異なるチャネルをミキシングしたりするような操作に関しては、32ビット画像を使用する方がはるかに簡単なようです。
24ビット画像と32ビット画像を使用した一般的な画像処理タスクのパフォーマンス特性はどうですか?
画像が大きく、操作が簡単な場合(アルファブレンディングなど)、24ビット/ピクセルの方が高速です。
多くの場合、画像処理の操作は非常に単純ですが、何百万もの操作を実行します。したがって、メインメモリからCPUにデータを出し入れするために使用される時間は、アルゴリズムのパフォーマンスを簡単に支配する可能性があります。
したがって、24ビット/ピクセルの画像は、移動するデータが1/4少ないため、32ビット/ピクセルの画像よりも優れています。
ただし、24ビット/ピクセルで適切に機能する画像処理コードを作成するのは面倒です。SSE命令は実際にはデータに適合しないため、バイトをシャッフルしてから、さまざまな配置をすべて処理する必要があります。
使用しているイメージが小さく、l1またはl2キャッシュに収まる場合は、状況が異なり、CPU時間がパフォーマンスを左右します。このような場合、32ビット/ピクセルの方がパフォーマンスが速くなります。
PSHUFB(別名_mm_shuffle_epi8)を備えた新しいx86 CPUでは、チャネルの分割を数サイクルで実行でき、ピクセル幅を32ビットに拡張するため、追加のメモリアクセスを発生させるよりも安価です。PSHUFBのない古いx86CPUでは、多くのシャッフルまたは解凍命令が必要であり、32ビットピクセルの方がはるかに効率的です。
NEONを備えたARMCPUでは、チャネルの分割はロードストアユニットによって無料で実行できます。NEONを使用しないARMCPUでは、チャネルの分割は、ピクセルあたり約3命令のコストでARMv6SIMD命令を使用して実行できます。