libvorbis SSE高速化パッチ Lancer 20061110
 
$Revision: 1.53 $
$Date: 2006-11-08 08:07:29+09 $
 
このプログラムについて

Xiph.org Foundationによりパテントフリーな音声圧縮技術として開発されたOgg Vorbisのエンコード/デコード速度を高速化するパッチです。

動作環境
CPU SSE, SSE2, SSE3拡張命令をサポートしているCPU
Intel(R) Pentium3以降の製品
AMD AthlonXP以降の製品
OS Windows95/NT不可(SSE非対応のため)
配布パッケージの説明
よくある質問
技術情報

このパッチは以下の環境でコンパイル可能なことを確認しています。

Visual Studio .NET 2003+Intel C++ Compiler 9.1.032

Visual Studio 2005(VCL8)+ICLでもICLの設定を変更することでコンパイル可能ですが現時点の環境ではバイナリの実行速度がわずかに低下する現象が発生しています。

コンパイル時にはシンボル__SSE__が定義されている必要があります。さらに__SSE2__を定義することによってSSE2対応になります。
__SSE3__でSSE3に対応になります。__SSE2__や__SSE3__を単独で指定することはできず下位ファンクションの指定が必須です。例えばSSE2対応なら__SSE__と__SSE2__の両方を指定する必要があります。

現時点でマルチスレッドはチャンネル別処理を別々のスレッドに分割しています。そのため、2chのソースをエンコードする際には4CPUのマシンでも最大2スレッド分の効果しか出ません。

もし、SSE最適化の施されていないコードを独自にマルチスレッド化しようとする場合、vorbisオリジナルのFFTはマルチスレッドには対応していませんのでクリティカルセッションを独自に調査する必要があります。後、_vorbis_block_allocは必ずクリティカルセッションで動作させなくてはなりません。
(2006.08.17追記)マルチスレッド内で_vorbis_block_allocを使用しないように変更しました。クリティカルセッションは速度低下の要因になるためです。

mapping0_forwardマルチスレッド後半部ではOggストリームへの出力順をスレッドの実行順に関わらず保証するために遅延書き込み処理用バッファを導入しています。

DLLを呼び出す際には親プロセスのスタックは16バイトにアラインメントされている必要があります。

oggdecの出力はSSE最適化によりvorbis-toolに含まれるGCC(SSEなし)でコンパイルされたoggdecが出力したものに近い結果になります。誤差といっても量子化で発生するものでわずかなものです。

CDex 1.60より後のバージョンではvorbis_info_clearが呼び出されなくなったため、本来開放されるべきメモリ空間が開放されずメモリリークを起こし、動作が止まってしまう可能性があります。現在この問題が修正されているのを確認しているのは以下のHPで配布されているバイナリのみです。

MOTO's HomePage

更新履歴

2006/11/03 Lancer 20061110

マルチスレッド版でモノラル音源をエンコードできない不具合を修正。
_vp_coupleのSSE最適化を改良。
_vp_coupleのマルチスレッド時の負荷を分散する計算を変更。
_vp_offset_and_mixのコードを削減。

2006/11/03 Lancer 20061103

ベースコードをaotuv-b5_20061024に変更
_vp_offset_and_mix, _vp_noise_normalize_sort, _vp_coupleのSSE最適化を変更
ICLを9.1.032にバージョンアップ
最適化コードの記述ミスを修正

2006/10/13 Lancer 20061013

メモリ管理コードの問題を修正

2006/10/05 Lancer 20061005

ICLを9.1.030にバージョンアップ
mapping0_forwardのMT用コードを改良。
コンパイル最適化オプションを変更
コンパイル時ワーニングの一部除去
GCCのサポート廃止

2006/09/15 Lancer 20060915

マルチスレッド用バイナリをプロファイル版から通常版に変更(MT時のプロファイル最適化効果が低いため)
mapping0_forwardのMT用コードの記述ミスを修正
マルチスレッド環境下のmdct_forward, mdct_backward, mdct_butterfly_genericでループ展開を実施

2006/09/03 Lancer 20060903

ICL用のインラインアセンブラコードの性能を精密測定、遅い部分を削除
キャッシュ制御関連コードの性能を精密測定、、遅い部分を削除
メモリ転送系コードの性能を精密測定、SSE最適化コードを一部復活
bark_noise_hybridmpのSSE 最適化を改良
oggenc2の経過表示の更新頻度をダウン。

2006/08/24 Lancer 20060824

ベースコードをaotuv-r1_20051117に変更
_vp_coupleにSSE最適化を追加
多チャンネル処理分割用のコードをxmmlib.hに追加
OpenMP使用時にシングルスレッド動作していた_vp_quantize_couple_memo, _vp_quantize_couple_sortをマルチスレッド動作に変更

2006/08/18 Lancer 20060816

mapping0_forwardのマルチスレッド処理を改良、並列処理部を増加させて高速化
coodbook.*でfloor1_encodeの並列処理を可能にするためOggストリームの遅延一括書き込み機能を実装
floor1_encodeを並列処理内で実行できるように変更
_vp_coupleを並列処理に対応
プロファイル計測時に無限ループに入らないように変更
MT用プロファイルビルドを復活

2006/08/15 Lancer 20060815(マルチスレッド問題評価用)

mapping0_forwardでOpenMP使用部分を分離
マルチスレッド部でOpenMPが必ずマルチスレッドを使用するように修正
高速化のためマルチスレッド部でクリティカルセッションの使用を抑制

2006/08/11 Lancer 20060811

mdct_backwardのSSE最適化を修正

2006/08/10 Lancer 20060810(ビットレート異常問題、マルチスレッド問題評価用)

_ve_ampのSSE最適化の問題を修正
マルチスレッド版で毎回異なるパターンが出力されていた問題を修正

2006/08/09 Lancer 20060809(ビットレート異常問題評価用)

_ve_ampのSSE最適化の一部に問題が発見されたため削除

2006/08/07 Lancer 20060807

mdct_forward, mdct_backwardのSSE最適化を修正
スタティック版のみvorbis_oggpack_writeを復活
local_book_besterror_dim1x4の問題を修正

2006/08/06 Lancer 20060806(メモリ問題評価用)

vorbis_oggpack_writeでヒープメモリアクセスエラーが発生するので廃止、最適化部はoggpack_writeに移動
oggpack_lookを最適化
_ve_ampのSSE最適化を変更
accumulate_fitのキャッシュ制御処理を修正
MDCT関連のキャッシュ制御で不完全だったのを修正
inspect_errorで不要なゼロデータ例外処理を削除
_encodepartのSSE最適化記述部を整理

2006/08/02 Lancer 20060802(メモリ問題評価用)

_vp_psy_clearでのメモリリークを修正
経過時間の計測をGetTickCountより精度の高いtimeGetTimeに変更
oggenc2の経過時間表示桁を増加
oggdecでtオプション使用時にデコード経過表示を抑制して正確な処理時間を計測するように変更
mdct_butterfly_first_backwardで事前計算を増やして処理を軽減
mdct_butterfly_genericのSSE3最適化を修正
couple_lossless_ps, couple_lossless, precomputed_couple_pointのインライン化判断をコンパイラに委譲
FFT関連処理で係数をテーブル化して処理を軽減
_ve_ampにSSE最適化を追加
最適化部全域でキャッシュ制御の見直し(一部参照頻度の低いテーブルを非テンポラルアクセスするように変更)
_encodepartのSSE最適化をlocal_book_besterrorを使用しないように変更

2006/07/22 Lancer 20060722

ICL用コードで内蔵命令を使用してインラインアセンブラを可能な限り排除
block.c内の独自メモリ転送用コードを廃止
bitreverseをテーブルを使用したものに改良
20060529の修正でvorbis_book_decodevv_addで速度低下が発生していたのを改善
vorbis_book_decodevv_addの最適化を阻害する記述を修正
mdct全域でトリガ用テーブル関連の処理を事前に計算するように変更
mdct_backwardで高周波成分が除去された部分の処理を簡略化
デコード処理専用のmdct_butterflies_backwardとmdct_butterfly_first_backwardを追加
bark_noise_hybridmpのSSE 最適化を改良
vorbis_noise_normalizeにSSE最適化を追加
render_lineをSSE 最適化
mdct_bitreverseにSSE3最適化を追加
seed_loop, max_seedsで一部の処理を事前に計算するように変更
seed_chaseを最適化
psy.cでのソートをSORT8, SORT32を自動生成コードで展開処理、SORT16を追加して高速化
_vp_noise_normalizeにSSE最適化を追加
SSE3環境下の非アラインメントメモリ読み込み処理でlddqu命令を使用するように変更
インラインアセンブラ部でのループ判定処理を改良
コンパイルした日付のソース変更を自動化
oggdecのベンチマーク用に出力ファイルを生成せず処理時間を表示するtオプションを追加

2006/06/16 Lancer 20060616

AMD CPU用にDLLファイルのCPU判別処理を置き換え
vorbis_oggpack_lookをインラインアセンブラで最適化
_mm_add_horz*にSSE3最適化処理を追加
oggdecをSSE最適化して追加
ov_read_float2pcmのSSE2最適化の不具合を修正
oggdropXPdのデコード部をSSE最適化
マルチスレッド用の最適化プロファイルをシングルスレッド用と共有化

2006/05/29 Lancer 20060529

codebook.c内のデコード部の不具合を修正

2006/05/12 Lancer 20060512

マルチスレッド処理コードでリソースの衝突する問題を修正
mapping_forward内で2つのマルチスレッド処理コードを統合

2006/05/06 Lancer 20060506

oggenc2を2.83にバージョンアップ
mapping_forward内でOpenMPを利用したチャンネル別マルチスレッド処理コードを導入
n=256〜4096までのFFTを全て最適化(マルチスレッド対策、16KHzやq<0で高速化)

2006/04/18 Lancer 20060418

SSE3対応コードを実装
OpenMPを利用したマルチスレッド対応コードを試験的に導入

2006/04/03

oggenc2を2.82にバージョンアップ
oggdropXPdを1.8.9にバージョンアップ

2006/03/31 Lancer 20060331

oggdropXPdを1.8.8にバージョンアップ
vorbis_oggpack_writeを最適化
floor1_fitのSSE最適化を変更
_vp_offset_and_mixのSSE最適化を変更
_vp_quantize_couple_memoのSSE最適化を変更
_vp_coupleのSSE最適化を変更
fft関連のコードでアンロール、レジスタリネーミング処理を実施
bark_noise_hybridmp後半部分のループ分割点計算を変更

2006/03/17 Lancer 20060317

oggdropXPdのDownMix機能を使用するとハングする問題を修正
DLLの性能向上のためoggpack_writeをvorbis側に新規追加
_ve_ampのSSE最適化コードを更新
floor1.cでの不要なSSE最適化コードを削除
inspect_errorでGCCのバグを回避するコードを追加
mdct_forward, bark_noise_hybridmp, fft関連のコードでアンロール、レジスタリネーミング処理を実施
bark_noise_hybridmpのループ分割点を事前に計算しておくように変更

2006/03/10 Lancer 20060310

oggdropXPdのエンコード品質スライダー動作が異常だった問題を修正
accumulate_fitとinspect_errorで重複していた演算をfloor1_fitに統合
mapping_forwardのメモリ転送処理をmdct_forwardに移動、_ve_ampのmdct_forward呼び出し部を変更
_vp_remove_floorのSSE最適化コードを更新
_vp_offset_and_mix内の不要な_mm_empty()を削除
res2_forwardのSSE最適化コードを更新
xmmlib.*にbitCountTableを追加

2006/03/03 Lancer 20060303

render_line, render_line0, inspect_errorの直線描画アルゴリズムの不具合を修正

2006/03/02 Lancer 20060302

デコード部のSSE2用コードの深刻な問題を修正
render_line, render_line0, inspect_errorの直線描画アルゴリズムを改良、一部SIMD最適化

2006/03/01 Lancer 20060301

コンパイル時最適化オプションを再検討
oggencをVer.2.81にアップデート
Visual Studoのプロジェクト管理機能が不安定なため開発環境をコマンドラインに全面的に移行
SSE2用最適化コードを実装
bark_noise_hybridmpとseed_curveにインラインアセンブラを使った最適化コードを実装
mdct_forwardのSSE最適化を変更。
render_line, render_line0にダブルステップBresebhamアルゴリズムを実装
コード解析にAMD CodeAnalystを導入

2006/01/31 Lancer 20060131

liboggを1.1.3にアップデート
oggencをVer.2.8にアップデート
oggdropXPdを1.8.7にバージョンアップ
mapping_forward, _2classのSSE最適化でICLの解析不完全に対応

2005/11/21 Lancer 20051121

ベースコードをaotuv-b4.51_20051117に変更

2005/11/18 Lancer 20051118

ベースコードをaotuv-b4.5_20051105に変更
ICLを9.0.022にバージョンアップ
psy.c内の無駄な定数テーブルを削除
メンテナンス性向上のためgcc用とICL用に分かれていたコードを統一

2005/08/13

ICLを9.0.021にバージョンアップ
oggdropXPdを1.8.6にバージョンアップ
libvorbis.dllをリリース

2005/07/09 Lancer 20050709

ベースコードをaotuv-b4_20050617_111mergedに変更
ICLを9.0.020にバージョンアップ
コンパイル時のワーニングを消去、抑制
ICLの最適化オプションを見直し

2005/06/21 Lancer 20050621

ベースコードをaotuv-b4_20050617に変更
ICLを9.0.019にバージョンアップ
min_indemnity_dipole_hypot_psをb4に合わせ修正
_vp_offset_and_mixをb4に合わせ修正
_vp_coupleをb4に合わせ修正
oggencをVer.2.6にアップデート
oggencのワイルドカード機能を凍結
oggdropXPdをVer.1.8.4にアップデート

2005/05/28 Lancer 20050528_1

oggenc2.exeでのパイプ経由でのエンコードの不具合を修正

2005/05/28 Lancer 20050528

Archer RC4から移行
ICLを8.1.026にバージョンアップ
ICLの2パス最適化コンパイルを使用開始
ベースコードをaotuv-pb4_20050412に変更
バージョン表記を日付のみに変更
バージョン管理にrcsを導入
oggencをoggenc2 Ver.2.5にアップデート
oggenc2のエンコード処理時間の計測精度向上
oggenc2をワイルドカード入力に対応(日本語対応?)
oggdropXPdをVer.1.8.3にアップデート
oggdropXPdのアニメーションイメージを変更
リサンプル用ライブラリlibsamplerateを導入
コンパイル時のワーニングを消去、抑制
DLLのUPX圧縮を廃止
ICL用とGCC用にコードを分離
3〜4命令の連結スケジューリング最適化を実施(ICLのみ)
キャッシュ関連最適化を廃止
メモリアクセスを_mm_load_ps, _mm_store_ps等で統一
GCC専用SSE2コードの追加
FFTコードの再SSE最適化
min_indemnity_dipole_hypot_psを追加
sqrtpsをrsqrtpsを使用した高速化コードに変更
mapping_forward内で確保後未使用のバッファを一時バッファに転用
bark_noise_hybridmp内でSSE最適化を追加
_vp_offset_and_mixにSSE最適化を追加
_vp_offset_and_mix内でSSE最適化を変更、追加
_vp_offset_and_mix内で使用されていない無駄な最適化部を削除
max_seedsを一部SSE最適化
seed_curveのSSE最適化を変更
_vp_coupleをpb4の変更に合わせてSSE最適化
_2classのSSE最適化を変更
mdct_backwardのSSE最適化を変更
vorbis_book_decodevv_addのSSE最適化を変更
ov_read_float2pcmのSSE最適化を変更

免責事項

このプログラムを使用したことにより生じたいかなる損害も当方は一切責任を持ちません。
自己責任の上でのご利用をお願いします。

著作権について

このパッチはパブリック・ドメインとします。改造・配布・転載は自由です。

THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2006
by the Xiph.org Foundation, http://www.xiph.org/

HP URL
http://homepage3.nifty.com/blacksword/
http://homepage3.nifty.com/blacksword/index_e.htm(Update Information Only)