libvorbis SSE高速化パッチ Lancer 20060529
 
$Revision: 1.28 $
$Date: 2006-05-29 06:50:31+09 $
このプログラムについて

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

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

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

gcc version 3.3.1 (mingw special 20030804-1)
Visual Studio .NET 2003+Intel C++ Compiler 9.0.022
gcc 3.4, gcc 4.0では正常に動作せず

コンパイル時にはシンボル__SSE__が定義されている必要があります。さらに__SSE2__を定義することによってSSE2対応になります。
__SSE3__でSSE3に対応になります。

現時点でマルチスレッドはチャンネル別処理を別々のスレッドに分割しています。そのため、2chのソースをエンコードする際には4CPUのマシンでも最大2スレッド分の効果しか出ません。
もし、SSE最適化の施されていないコードを独自にマルチスレッド化しようとする場合、vorbisオリジナルのFFTはマルチスレッドには対応していませんのでクリティカルセッションを調査する必要があります。

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

ICL使用時にFLACで最適化に-O3を指定すると出力結果が異常になるので-Oxに抑制しています。
oggenc2はプロファイル生成モードでfloor1.cのSSE2最適化コードがハングするのでプロファイル生成モードのみfloor1.cの最適化コードの一部を無効にしてあります。
oggdropXPdはプロファイル使用モードで-Qipoオプションを使用してビルドするとエンコード終了時にハングするのでoggdropXPdのみ-Qipでコンパイルしてあります。
SSE最適化を施してあるファイルにはコンパイル時の最適化オプションの一部を-O2 -Qip -Qunroll0に抑制してあります。

更新履歴

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)