Android x86向けアプリケヌションの最適化実瞟のある方法



スクリプトや非ネむティブ蚀語JavaやHTML5などのみで蚘述されたAndroidアプリケヌションでも、最終的にはランタむムの基本コンポヌネントを䜿甚するため、最適化する必芁がありたす。 最適化のアプロヌチずニヌズを説明する良い䟋は、以䞋で説明するマルチメディアおよび拡匵珟実技術を䜿甚するアプリケヌションです。 Androidプラットフォヌムスマヌトフォンおよびタブレットの堎合、IntelはさたざたなタむプのAtomプロセッサヌずSSSE3レベルのベクトル化を䜿甚し、通垞はハむパヌトレッドを備えた2぀のコアを䜿甚したす。 iOnRoad -iOnRoad。



問題の声明

iOnRoadは、安党運転を支揎する拡匵珟実スマヌトフォンアプリです。 GPS、センサヌ、スマヌトフォンのビデオカメラ、および最新のコンピュヌタヌビゞョンアルゎリズムを䜿甚しお、アプリケヌションはドラむバヌに車線を離れるだけでなく、他の車や障害物ずの衝突の可胜性に぀いお譊告したす。 このアプリケヌションは非垞に人気があり100䞇回以䞊ダりンロヌドされおいたす、さたざたな賞を受賞したしたが、2぀の欠点しかありたせんでした。

1.隣の車の酔っぱらい運転手や矎しい女の子、およびあなたの車が続くずきに道路に投祚する他の興味深い仲間の旅行者に぀いおは譊告したせん。

2.スマヌトフォンを30分から40分以䞊電源に接続しないず元のバヌゞョンを䜿甚できなかったため、バッテリヌが完党に消耗したため、電力消費を含む最適化が必芁です。



珟時点では、欠点は1぀だけです。 最初の



そのため、アプリケヌションはリアルタむムで動䜜し、YUV420 / NV21圢匏の各゜ヌスフレヌムをスマヌトフォンのカメラからRGB圢匏に倉換しおから、さらに凊理したす。

圓初、この倉換を実装する関数はプロセッサリ゜ヌスの最倧40を䜿甚しおいたため、さらなる画像凊理の可胜性が制限されおいたした。 したがっお、最適化の必芁性は緊急のように思われたした。

既存の最適化された唯䞀の関数は、IPPパッケヌゞ Intel Integrated Performance Primitivesラむブラリ のYUV420ToRGB関数ですが、iOnRoadでサポヌトされる入力圢匏ず出力圢匏の必芁な組み合わせはありたせん。 さらに、マルチスレッドではありたせん。

したがっお、必芁な倉換を実装する新しい最適化されたコヌドを蚘述するこずが決定されたした。



YUV420 / NV21からRGBぞの倉換

YUV420 / NV21圢匏には、3぀の8ビットコンポヌネント-茝床Y癜黒ず2぀のカラヌコンポヌネントUおよびVが含たれたす。







暙準のRGB圢匏で4぀のピクセルを取埗するには各ピクセルに3぀の色成分を䜿甚、Yの各4぀の成分には、察応する成分UずVのペアが1぀だけ必芁です。

䞊の図では、察応する4倍線Yずそれらに察応するUずVのペアが同じ色でマヌクされおいたす。 この圢匏䞀般にYUVず呌ばれたすは、RGBを2倍に圧瞮したす。



YUVからRGBぞの倉換-テヌブルルックアップテヌブル、LUTを䜿甚した敎数アプロヌチ

YUVからRGBぞの倉換は、単玔な線圢匏に埓っお実行されたす。 浮動小数点数ぞの倉換を回避するために、iOnRoadは次の有名な敎数近䌌を䜿甚したした。







2 16を超えるこの匏を䜿甚した蚈算の䞭間結果は、ベクトル化をさらに議論するための重芁なポむントです。

いわゆるルックアップテヌブルLUTがiOnRoadのスカラヌ蚈算に䜿甚されたしたすべおのコンポヌネントY、U、およびVは8ビットであるため、䞊蚘の匏の乗算は事前に蚈算でき、32ビットの結果は5぀に栌玍されたす256入力のテヌブル。



YUVからRGBぞの倉換-SSE固定小数点コンピュヌティングを䜿甚する䞀般的な考え方

SSEには、LUTを操䜜するためのベクタヌ収集呜什がありたせん。 16ビットのパック数倀のベクトル乗算の䜿甚は、スカラヌLUT操䜜ず埌続のパッケヌゞングの組み合わせよりも高速に思えたす。 ただし、予想される䞭間結果は2 16を超える可胜性があるため、単玔な16ビットSSE乗算PMULLWは䜿甚できたせん。 SSEには、完党な16ビット乗算ず32ビット䞭間結果の右シフトを必芁な16ビット䞞めに結合するPMULHRSW呜什がありたす。 この呜什を䜿甚するには、オペランドを前に巊にシフトしお、最終結果の有効ビットの最倧数を指定する必芁がありたす特定のケヌスでは、13ビットの最終結果を取埗できたす。



手動のSSEコヌドを蚘述する手段ずしおの組み蟌み関数組み蟌み関数

アセンブラを䜿甚しお手動のSSEコヌドを蚘述しないようにするため、既知のすべおのC / C ++コンパむラMS、GNU、Intelには、組み蟌み関数ず呌ばれる特別なAPIのセットがありたす。

プログラマヌの芳点から芋るず、組み蟌み関数は通垞のC / C ++関数のように芋え、動䜜したす。 実際、SSEの1぀のアセンブラヌ呜什のラッパヌであり、ほずんどの堎合、この呜什ずしおのみコンパむルされたす。 組み蟌み関数を䜿甚するず、同じパフォヌマンスむンゞケヌタヌでアセンブリコヌドをすべおの耇雑さで蚘述する必芁がなくなりたす。

たずえば、䞊蚘のPMULHRSW呜什を呌び出すには、Cコヌドで組み蟌み関数_mm_mulhrs_epi16を䜿甚したした。

各SSE呜什には察応する組み蟌み関数があるため、組み蟌み関数を䜿甚しお必芁なSSEコヌドを完党に蚘述するこずができたす。



YUVからRGBぞの倉換-SSE固定小数点コンピュヌティングの実装

このプロセスは、16個の8ビットYず8個の8ビットペアU、Vの2぀のサヌビングをロヌドするこずから始たりたす。

その結果、このデヌタは16の32ビットRGBピクセルに倉換されたす䞊䜍バむトが0xffに蚭定されおいる堎合はFRGBの圢匏で。

16の8ビットYから飜和した8ビット枛算の操䜜を䜿甚しお16が枛算されるため、ネガティブの結果を確認する必芁はありたせん。

8ペアU、Vは、Yの倀が16の2行を「提䟛」したす。

入力デヌタをアンパックするには、シャッフル操䜜が䜿甚されたす。この堎合、次の2぀のサヌビングが䜿甚されたす。



以䞋は、䞀郚の補造の詳现図です。







UずVを䜿甚する前に、16ビット_mm_sub_epi16呜什を䜿甚しお、それらから128が枛算されたす。

枛算埌、Y、U、Vの8぀の16ビット倀はすべお、_mm_mulhrs_epi16に最適に適合するように巊にシフトされたす。 この呜什は、適切にパックされたオッズで䜿甚されたす。



泚䞊蚘のこれらの準備手順枛算ずシフトは、スカラヌアルゎリズムのLUT操䜜の代わりに䜿甚されたす。



_mm_min_epi16および_mm_max_epi16を䜿甚しお、0〜2 13 -18191に制限された最終16ビット倀を取埗するために、乗算結果が芁玄されたす。

すべおの蚈算が完了するず、R、G、Bの個別にパックされた16ビット倀の圢匏で結果が埗られたす。

それらをFRGB圢匏FはiOnRoadの芁件に応じたナニットで満たされたアルファチャネルに再パックするこずは、2぀のステップで実行されたす。

最初のステップでは、16ビット<0xff00>で埋められた远加のレゞスタを䜿甚しお、R、G、およびBの16ビットの個別の倀を16ビットFRおよびGBに再パッケヌゞ化したす。 この再パッケヌゞ化フェヌズは、図に瀺すように、論理的な巊シフトず右シフト、および論理OR / AND挔算を䜿甚しお実行されたす。







2番目のステップでは、䞭間結果FRおよびGBが、アンパック呜什_mm_unpacklo_epi16および_mm_unpackhi_epi16を䜿甚しお最終的にFRGBにパッケヌゞ化されたす。







SSEの組み蟌みベクトル関数を䜿甚しおYUVからRGBぞの倉換を実装する䞊蚘のコヌドは、事前蚈算テヌブルLUTを䜿甚した元のスカラヌコヌドず比范しお4倍の加速を提䟛したす。



䞊列化にCILK +を䜿甚する簡単

スマヌトフォンずタブレットで䜿甚されるAtomプロセッサのすべおのバヌゞョンには、少なくずも2぀のコア少なくずも論理コア-HTがあり、将来はさらに倚くのコアが搭茉されるため、アルゎリズムの䞊列化は非垞に重芁です。

䞊列化ぞの最も単玔なアプロヌチは、CおよびC ++のむンテルコンパむラヌのCILK +拡匵機胜で実装されおいたす有名なTBBはC ++でのみ動䜜したす 最も単玔な䞊列化挔算子cilk_for暙準のC / C ++蚀語ではなく、YUVからRGBぞの倖郚倉換に䜿甚は、デュアルコアClover Trail +プロセッサヌのパフォヌマンスを2倍に向䞊させたす。

CILK +䞊列化ず組み合わせおSSEの内郚ベクトル化機胜を䜿甚するず、党䜓で8倍の加速が埗られたす。



ベクトル化のためのCILK +の䜿甚配列衚蚘、関数マッピング、および削枛

CILK +には、配列衚蚘ず呌ばれる非垞に重芁な拡匵機胜が含たれおいたす。これにより、ベクトル化の効率が倧幅に向䞊するず同時に、コヌドの可読性が向䞊したす。

配列衚蚘はプラットフォヌムのスケヌラビリティを提䟛したす。128ビットAtom、256ビットHaswell、および512ビットMIC / Skylakeの䞡方で同じコヌドを最適にベクトル化できたす-内郚SSE / AVX関数に基づくコヌドずは異なりたす特定のプラットフォヌムごずに手動で曞き換える必芁がありたす。 配列衚蚘を䜿甚するず、配列のいわゆるセクションを関数の匕数関数マッピングずしお䜿甚したり、瞮小合蚈、最倧/最小怜玢などしたりできたす。



CILK +配列衚蚘の䟋

2぀のコヌドスニペットを芋おください。

耇雑な定矩ず開発を䌎う゜ヌスコヌド実際のアプリケヌションから取埗







そしお、配列衚蚘法、関数のマッピングずリダクションのセクションで構成されるCILK +芁玠ずの単䞀行の組み合わせ







これらの2぀のオプションは機胜的な芳点からはたったく同じですが、CILK +バヌゞョンは6倍高速に動䜜したす



結論ず開発者ぞの呌びかけ

内郚SSE機胜SSSE3レベルは、Atom / Intelデバむスのアプリケヌションパフォヌマンスを倧幅に向䞊させたす。

CILK + Array NotationIntelコンパむラに組み蟌たれおいるを䜿甚するず、自動ベクトル化の倧きな機䌚が埗られたす。

CILK +は、Atom / Intelデバむス䞊のアプリケヌションを䞊列化する優れた方法です。

新しい「アンドロむド」の䞖界のAtom / Android開発者ぞの掚奚事項SSEずCILK +を䜿甚しおマルチメディアアプリケヌションずゲヌムを最適化するこずをためらわないでください-これらの実瞟のあるツヌルは生産性の倧きな飛躍をもたらしたす



Intelむスラ゚ル、シニアアプラむド゜リュヌション゚ンゞニア、Grigory Danovichが執筆。



All Articles