Elbrusプラットフォヌムでのロシア連邊のパスポヌトの承認。 パヌト1

この蚘事では、パスポヌト認識プログラムの冒険に぀いお匕き続き説明したす。パスポヌトぱルブラスに送られたす













それでは、Elbrusアヌキテクチャに぀いお䜕を知っおいたすか







Elbrusは、高い安党性ず信頌性を特城ずする、高性胜で゚ネルギヌ効率の高いプロセッサアヌキテクチャです。 Elbrusアヌキテクチャの最新のプロセッサは、サヌバヌ、デスクトップコンピュヌタヌ、さらには組み蟌みコンピュヌタヌずしおも䜿甚できたす。 情報セキュリティ、䜿甚枩床範囲、補品のラむフサむクルに察する増倧する芁件を満たすこずができたす。 MCSTの出版物[1、2]が瀺すように、Elbrusアヌキテクチャプロセッサは、信号凊理、数孊モデリング、科孊蚈算、および蚈算胜力の芁件が増加した他のタスクの問題を解決するように蚭蚈されおいたす。







Smart Enginesでは、゚ルブルスのパフォヌマンスが、速床を倧幅に䜎䞋させるこずなくパスポヌト認識を実珟するのに十分であるこずを確認しようずしたした。







抂芁Elbrusアヌキテクチャの機胜



Elbrusアヌキテクチャは、広範なコマンドワヌドVery Long Instruction Word、VLIWの原理を䜿甚するアヌキテクチャのカテゎリに属したす。 VLIWアヌキテクチャヌを搭茉したプロセッサヌでは、コンパむラヌは䞀連のコマンドワむドコマンドワヌドのグルヌプのシヌケンスを生成したす。グルヌプ内のチヌム間の䟝存関係はなく、異なるグルヌプのチヌム間の䟝存関係は最小限に抑えられたす。 これらのコマンドグルヌプは䞊列で実行され、操䜜レベルで高レベルの䞊列凊理を提䟛したす。









コマンドレベルでの䞊列化は、最適化コンパむラによっお完党に提䟛されたす。これにより、たずえばx86アヌキテクチャの堎合のように、䞊列化タスクが解決されないため、コマンドの実行装眮が倧幅に簡玠化されたす。 システムの消費電力が削枛されたす。これらのタスクはすべおコンパむラに割り圓おられるため、プロセッサはオペランド間の䟝存関係を分析したり、操䜜を䞊べ替えたりする必芁がなくなりたす。 コンパむラヌは、ハヌドりェアバむナリコヌドアナラむザヌよりもはるかに倧きな蚈算および時間リ゜ヌスを持っおいるため、より培底的な分析を実行し、より独立した操䜜を芋぀け、その結果、より効率的に実行される幅広いコマンドワヌドを圢成できたす。







操䜜の䞊列凊理の䜿甚に加えお、Elbrusアヌキテクチャは、蚈算凊理に固有のその他のタむプの䞊列凊理の実装も実装したす。ベクトル䞊列凊理、共有メモリの制埡フロヌの䞊列凊理、マルチマシンコンプレックスのタスクの䞊列凊理です。







さらに、Elbrusアヌキテクチャは、Intel x86アヌキテクチャずバむナリ互換であり、動的なバむナリ倉換に基づいお実装されおいたす。







Elbrusアヌキテクチャのもう1぀の重芁な機胜は、実行時にプログラムずデヌタを保護するためのハヌドりェアサポヌトです。 プログラムは、ハヌドりェアレベルで実装された単䞀の仮想空間で実行されたす。これにより、悪意のあるコヌドが実行される可胜性が最小限に抑えられ、他のアヌキテクチャでは怜出が困難な゚ラヌを怜出できたす。







したがっお、Elbrusプロセッサのアヌキテクチャの䞻な機胜[3、4]









゚ルブラスずの知り合い



䜿甚した特定のマシンはElbrus 4.4で、4぀の4コアElbrus 4Cプロセッサず3぀のメモリコントロヌラ、3぀のプロセッサ間通信チャネル、1぀のI / Oチャネル、8 MB L2キャッシュコアあたり2 MBを組み合わせたした。 。 Elbrus 4Cの動䜜クロック呚波数は800 MHz、技術基準は65 nm、平均消費電力は45ワットです。 オペレヌティングシステム-Linuxに基づいお䜜成されたOS「Elbrus」。 uname -a



瀺したものは次のずおりです。













Elbrusの最適化コンパむラはlccず呌ばれたす。 2015幎8月27日付けのgcc 4.4.0ず互換性のあるLccバヌゞョン1.20.09がサヌバヌにむンストヌルされたした。 lccは暙準のgccフラグず連携し、いく぀かの远加フラグも定矩したす。 暙準フラグから、-ffastず-ffast-mathに泚意を払いたした。 これらのオプションには、実際の挔算による倉換が含たれおいるため、デフォルトでオフになっおいたす。これにより、実際の操䜜および機胜に぀いおIEEEたたはISO芏栌に厳密に埓う必芁があるプログラムの誀った結果が生じる可胜性がありたす。 さらに、それらには朜圚的に危険な最適化が含たれおおり、たれにポむンタヌを自由に操䜜するプログラムの䞍正な動䜜に぀ながる可胜性がありたす。 䞡方のフラグには、さらに-fstdlib、-faligned、-fno-math-errno、-fno-signed-zeros、-ffinite-math-only、-fprefetch、-floop-apb-conditional-loads、-fstrict-aliasingが含たれたす。 それらの䜿甚は、プログラムのパフォヌマンスに倧きく圱響したす。







さらに、lccでは最適化を埮調敎できたす。たずえば、関数眮換パラメヌタヌを蚭定するための䞀連のフラグがありたす。







è¡š1.フラグlcc。関数の眮換のパラメヌタヌを制埡できたす。







Lccフラグ 予定
-finline-level = <f> 眮換匷床の増加係数を蚭定したす[0.1-20.0]
-finline-scale = <f> 䞻なリ゜ヌス制限の増加係数を蚭定したす[0.1-5.0]
-finline-growfactor = <f> 眮換埌のプロシヌゞャのサむズの最倧増加を蚭定したす[1.0-30.0]
-finline-prog-growfactor = <f> 眮換埌のプログラムサむズの最倧増加量を蚭定したす[1.0-30.0]
-finline-size = <n> むンラむンプロシヌゞャの最倧サむズを指定したす。
-finline-to-size = <n> 眮換を実行できるプロシヌゞャの最倧サむズを指定したす。
-finline-part-size = <n> 郚分眮換のプロシヌゞャの掚定領域の最倧サむズを蚭定したす。
-finline-uncond-size = <n> 無条件に眮換されたプロシヌゞャの最倧サむズを蚭定したす。
-flib-inline-uncond-size = <n> 無条件に眮換されたラむブラリプロシヌゞャの最倧サむズを蚭定したす。
-finline-probable-calls = <f> 呌び出しカりンタヌがargument * max_call_countより小さいプロシヌゞャヌの眮換を防止したす。

ここで、max_call_countは、タスク党䜓の呌び出し操䜜の最倧カりンタヌです。
-fforce-inline むンラむン指定子を䜿甚した無条件の関数眮換が含たれたす。
-finline-vararg 可倉数の匕数を䜿甚した関数眮換が含たれたす。
-finline-only-native 明瀺的なむンラむン修食子を持぀関数のみを眮換したす


プロシヌゞャヌ間の最適化、ポむンタヌ分析、デヌタペヌゞングなどを蚭定するこずもできたす。







Elbrusのプロファむリングでは、倚くの人が䜿い慣れたperfを䜿甚できたすが、あたり知られおいないdprofも䜿甚できたす。 さらに、dprofの拡匵機胜を䜿甚しお、プロファむルをvalgrind互換の圢匏に倉換できたす。







そのため、私たちの目暙は、パスポヌト認識プログラムのコン゜ヌルバヌゞョンを立ち䞊げるこずでした。 完党にC / C ++で蚘述されおおり、C ++ 11を䜿甚するこずもありたす。 C ++ 11のサポヌトが蚘茉されおいないずいう事実にもかかわらず、実際にはlccは非垞に遞択的ではありたすがそれを理解しおいたす。 C ++ 11の完党なサポヌトは、lccの新しいバヌゞョンで蚈画されおいたす。

厳密にはサポヌトされおいたせん









さらに、std :: unique_ptr、std :: shared_ptrはそれ自䜓でサポヌトされおいたす。







さらに、lccはgcc拡匵子__uint128_tず、BOM付きのUTF-8゚ンコヌドされた゜ヌスファむルを混乱させたす。







サポヌトされおいないコヌドを曞き盎した埌、プロゞェクトを正垞にコンパむルするこずができたした。 ただし、パスポヌト認識プログラムを単玔に実行するこずはできたせんでした。開始しようずしたずきに、バス゚ラヌが発生したした。 ICSTの専門家ず盞談した結果、問題は、䜿甚しおいるEigenラむブラリ内で発生する䞍均衡なメモリアクセスであるこずがわかりたした。







Eigenは、C ++ [5]で蚘述された最適化されたヘッダヌのみの線圢代数ラむブラリです。 行列およびベクトルのさたざたな操䜜に䜿甚でき、x86 SSE、ARM NEON、PowerPC AltiVec、およびIBM S390xの最適化も含たれおいたす。







Eigen開発者は、ラむブラリがElbrusで䜿甚されるこずを期埅しおいなかったため、サポヌトされおいるアヌキテクチャのリストにラむブラリを含めず、アラむメントされたメモリアクセスモヌドを無効にしたした。 MCSTの同僚は、この問題の修正を迅速に支揎し、修正方法を瀺したした。













この远加の結果、必芁なEigen機胜が獲埗されたした。 これは、EigenずElbrusの非互換性であり、含たれる最適化によっおのみ明らかになるこずに泚意しおください。







しかし、私たちの䞍幞はそこで終わりたせんでした。 ゚ラヌBus゚ラヌは消えおいたせんが、ラむブラリのコヌドの実行䞭に発生したした。 少し調査した結果、認識䞭に远加の画像コンテナの初期化䞭に非敎列メモリアクセスが定期的に発生するこずがわかりたした。







スピヌドを䞊げるために、8ビット画像の行に固定倀を入力するず、4バむトの倍数である行の䞀郚があり、32ビット倀元の8ビットをコピヌしお䜜成されたが入力され、残りの行はすでに1バむトで入力されおいたした。 ただし、8ビット画像を割り圓おる堎合、メモリ内のアラむメントは1バむトのみに保蚌され、このアドレスに32ビット倀を曞き蟌もうずしおいるずきに゚ラヌが発生したした。

この問題を解決するために、必芁なバむト数の倍数である最も近いアドレスの蚈算蚘述されおいる堎合は4の蚈算を行凊理の先頭に远加し、このアドレスを1バむトで埋め、このアドレスから既に4バむトを埋めおいたす。

この゚ラヌを修正した埌、私たちのプログラムは起動しただけでなく、正しい動䜜を瀺したした













すでに小さな勝利でしたが、先に進みたした。 次のステップでは、システムの最適化に盎接進みたした。 私たちのプログラムは2぀のモヌドで動䜜したす写真たたはスキャンされた画像のパスポヌトの任意に配眮された広がりの認識任意のモヌド、およびビデオのパスポヌトの認識モバむルモヌド。 2番目のケヌスでは、パスポヌトがフレヌムの倧郚分を占め、フレヌムごずにその䜍眮がわずかに倉化し、1぀のフレヌムの凊理にはドキュメント怜玢アルゎリズムが倧幅に簡略化されおいるず想定されたす。







どこでもモヌドで1぀のテスト画像を認識し、すぐに1぀のストリヌムに移動しお、玄100秒間Elbrusで動䜜したした。







最初に、Elbrus 4.4の16コアすべおを䜿甚しようずしたした。 16スレッドすべおを効果的に䜿甚するこずは、プログラムの玄3分の1でのみ可胜でした。 残りの蚈算は2぀のスレッドに䞊列化されたした。 その結果、認識時間は7.5秒に短瞮されたした。 むンスピレヌションを受けお、プロファむラヌを芋たした。 驚いたこずに、次のようなものを芋たした。













メむンプログラムルヌプ内に玠晎らしい堎所があるこずがわかりたした。







 std::vector<Object> candidates; for (int16_t x = x_min; x < x_max; x += x_step) for (int16_t y = y_min; y < y_max; y += y_step) candidates.emplace_back(x, y, 0.0f);
      
      





このコヌドを繰り返し実行した結果、ベクトルのサむズを倉曎するオヌバヌヘッドコストは倧幅に増加し、認識時間の16に達したす。 他のアヌキテクチャでは、この堎所は目立ちたせんでしたが、Elbrusではメモリの割り圓おが予想倖に遅いこずが刀明したした。 この厄介な芋萜ずしを修正した埌、動䜜時間はほが1秒短瞮されたした。







次に、各スレッドVLIWのメむン「チップ」内の同時実行性を向䞊させたした。 これを行うために、最短パス-MCSTの専門家によっお既に最適化されたEMLラむブラリを䜿甚したした。







高性胜EMLラむブラリ



Elbrusアヌキテクチャのマむクロプロセッサ甚に、EMLラむブラリが開発されたした。これは、信号、画像、ビデオ、および数孊関数ず挔算の高性胜凊理のためのさたざたな関数セットをナヌザヌに提䟛するラむブラリです[4、6]。







EMLには、次の機胜グルヌプが含たれおいたす。









EMLラむブラリは、C / C ++で曞かれたプログラムで䜿甚するこずを目的ずしおいたす。







䜎レベルの画像凊理関数は、EMLで盎接サポヌトされるか、ベクトルこの堎合は画像文字列を介したEMLの基本的な算術関数で衚珟できたす。







たずえば、32ビット実数の2぀の配列の芁玠ごずの加算







 for (int i = 0; i < len; ++i) dst[i] = src1[i] + src2[i];
      
      





EML関数を䜿甚しお実行できたす。







 eml_Status eml_Vector_Add_32F(const eml_32f *pSrc1, const eml_32f *pSrc2, eml_32f *pDst, eml_32s len)
      
      





どこで









圌女は戻りたす









合蚈で、eml_Status列挙は4぀の倀を取るこずができたす。









䞻なデヌタ型が定矩されおいたす







 typedef char eml_8s; typedef unsigned char eml_8u; typedef short eml_16s; typedef unsigned short eml_16u; typedef int eml_32s; typedef unsigned int eml_32u; typedef float eml_32f; typedef double eml_64f;
      
      





32ビット実数の芁玠ごずの乗算の関数も同様に配眮されたす。







 eml_Status eml_Vector_Mul_32F(const eml_32f *pSrc1, const eml_32f *pSrc2, eml_32f *pDst, eml_32s len)
      
      





ただし、敎数の堎合、そのような挔算を実行する芁玠ごずの加算およびシフト乗算関数のみが定矩されたす。







 // Addition for (int i = 0; i < len; ++i) dst[i] = SATURATE((src1[i] + src2[i]) << shift); // Multiplication for (int i = 0; i < len; ++i) dst[i] = SATURATE((src1[i] * src2[i]) << shift);
      
      





そしお実際にはEML関数







 // int16_t addition eml_Status eml_Vector_AddShift_16S(const eml_16s *pSrc1, const eml_16s *pSrc2, eml_16s *pDst, eml_32s len, eml_32s shift) // int32_t addition eml_Status eml_Vector_AddShift_32S(const eml_32s *pSrc1, const eml_32s *pSrc2, eml_32s *pDst, eml_32s len, eml_32s shift) // uint8_t addition eml_Status eml_Vector_AddShift_8U(const eml_8u *pSrc1, const eml_8u *pSrc2, eml_8u *pDst, eml_32s len, eml_32s shift) // int16_t multiplication eml_Status eml_Vector_MulShift_16S(const eml_16s *pSrc1, const eml_16s *pSrc2, eml_16s *pDst, eml_32s len, eml_32s shift) // int32_t multiplication eml_Status eml_Vector_MulShift_32S(const eml_32s *pSrc1, const eml_32s *pSrc2, eml_32s *pDst, eml_32s len, eml_32s shift) // uint8_t multiplication eml_Status eml_Vector_MulShift_8U(const eml_8u *pSrc1, const eml_8u *pSrc2, eml_8u *pDst, eml_32s len, eml_32s shift)
      
      





このような関数は、たずえば敎数挔算に圹立ちたす。







EMLは画像の構造を定矩したす







 typedef struct { void * data; /**<     */ eml_image_type type; /**<    */ eml_32s width; /**<    ,  x */ eml_32s height; /**<    ,  y */ eml_32s stride; /**<       */ eml_32s channels; /**<   ()   */ eml_32s flags; /**<   */ void * state; /**<     */ eml_32s bitoffset;/**<           */ eml_format format; /**<   */ eml_8u addition[32 - 2 * sizeof (void *)]; /**<     64  */ } eml_image;
      
      





画像でサポヌトされおいるeml_image_typeデヌタ型









EMLは、画像凊理に必芁な他の機胜もサポヌトしおいたす。 たずえば、分離可胜なフィルタヌの効果的な実装に必芁な転眮関数は次のずおりです。







 eml_Status eml_Image_FlipMain(const eml_image *pSrc, eml_image *pDst)
      
      





この関数は、元の画像の䞭心を結果の画像の䞭心に重ね、転眮を実行したす。 圌女の䜜品は次の匏で説明できたす。







 dst[width_dst/2 + (y - height_src/2), height_dst/2 + (x - width_src/2)] = src[x, y],  x = [0, width-1], y = [0, height-1]
      
      





画像は同じデヌタ型 EML_UCHAR, EML_SHORT, EML_FLOAT EML_DOUBLE



であり、同じチャネル数1、3、たたは4である必芁がありたす。







実隓ず結果



è¡š2は、さたざたなデヌタ型の加算ず乗算の実行時間を瀺しおいたす。 この実隓では、長さ10 5 50の2぀の配列の加算/乗算の1000回の反埩の実行時間を枬定し、埗られた倀から䞭倮倀を取りたした。 この衚は、1回の反埩の平均実行時間を瀺しおいたす。 EMLを䜿甚するず、実際の32ビット数ず8ビット笊号なし敎数の蚈算を倧幅に高速化できるこずがわかりたす。 これらのデヌタ型は最適化された画像凊理パスで頻繁に䜿甚されるため、これは重芁です。







è¡š2.長さ10 5の配列のElbrus 4.4による加算ず乗算の実行時間。







远加
デヌタ型 uint8_t 浮く
EMLなし、Όs 16.7 148.8
EML、Όs 8.0 83.6


乗算
デヌタ型 uint8_t 浮く
EMLなし、Όs 31.4 108.9
EML、Όs 27.6 73.5


次に、EMLが画像でどのように機胜するかを確認し、転眮を調べたした。これは、画像凊理でかなり䞀般的な操䜜であるためです。 さたざたなタむプの正方圢画像の転眮時間のサむズ䟝存性













EMLがuint8_tおよびfloat型の優れた加速を瀺しおいるこずがわかりたす。







パスポヌト認識プログラムテストむメヌゞ、゚ニりェアモヌドを高速化した結果を衚3に瀺したす。これらは、゚ルブルスずの共同䜜業の最初の3か月で埗られたものであり、もちろん、システムの最適化に取り組む予定です。







è¡š3. Elbrus 4.4のパスポヌト認識プログラムの最適化プロセス。







バヌゞョン 劎働時間、s
1スレッド 〜100
16スレッド、O3 6.2
16スレッド、O4 5.4
16ストリヌム、O4、トランスポヌズEML 5.0
16ストリヌム、O4、転眮、行列挔算EML 4.5
16ストリヌム、O4、転眮、行列挔算、算術挔算EML 3.4


最適化されたバヌゞョンの動䜜時間を掚定するために、各モヌドの1000入力画像あたりの動䜜時間を分析したした。 è¡š4に、゚ニりェアモヌドずモバむルモヌドでの1フレヌムの最小、最倧、および平均認識時間を瀺したす。







è¡š4. Elbrus 4.4でのパスポヌト認識の営業時間。







モヌド 最小時間、s 最倧時間、s 平均時間、s
どこでも 0.9 8.5 2.2
モバむル 0.2 1.5 0.6


むンテルやARMずパフォヌマンスを比范したせんでした。これらのプロセッサヌ向けにラむブラリを最適化するのに数幎かかりたした。わずか3か月の操䜜で今すぐ比范を行うのは正しくありたせん。







おわりに



この蚘事では、Elbrusのような珍しいアヌキテクチャにプログラムを移怍した経隓を共有しようずしたした。 「これは確かに私たちには起こりえないこずです」私たちはいく぀かのタむプのプログラム゚ラヌを議論しお考えたしたが、誰も愚かな間違いから安党ではありたせん。 Elbrusプラットフォヌムを䜿甚するこずで、コヌド内の少なくずも2぀の問題のある堎所を芋぀けるこずができたため、メヌカヌの玄束が満たされたず芋なすこずができたす。







わずか数か月で、正しい認識䜜業を達成できるだけでなく、Elbrusのシステムを倧幅に高速化するこずもできたした。 Elbrus 4.4ずx86のパスポヌト認識プログラムのパフォヌマンスは桁違いに異なり、非垞に良い結果です。 そしお、私たちはそこで停止する぀もりはありたせん。 それでも倧幅に改善できるず考えおいたす。







これはすべお、゚ルブラスぞの旅の最初のステップが非垞に成功したずみなせるこずを意味したす







ハヌドりェアプラットフォヌムを提䟛しおくれたMCST瀟ずその埓業員、およびアヌキテクチャず最適化に関するアドバむスに感謝したす。







䜿甚した゜ヌス



[1] A.K. キム、I.N。 Bychkov et al。今日の建築ラむン「゚ルブラス」マむクロプロセッサ、コンピュヌタヌシステム、゜フトりェア//珟代の情報技術ずIT教育。 レポヌトの収集、p。 21–29。

[2] A.K. キム。 ロシアの汎甚マむクロプロセッサず高性胜コンピュヌティングシステム結果ず将来の展望。 無線電子機噚シリヌズEVTの質問、T。3、p。 2012幎5月13日。

[3] A.K. キムずI.N. ビチコフ。 パ゜コン、サヌバヌ、スヌパヌコンピュヌタヌ向けのロシアの゚ルブルス技術。

[4] V.S. Volin et al。Elbrusファミリヌのマむクロプロセッサずコンピュヌティングシステム。 孊習ガむド。 ピヌタヌ、2013幎。

[5] Eigen、線圢代数甚のC ++テンプレヌトラむブラリ行列、ベクトル、数倀゜ルバヌ、および関連アルゎリズム、 http//eigen.tuxfamily.org

[6] P.A. むシン、V.E。 Loginov、およびP.P. ノァシリ゚フ。 Elbrusアヌキテクチャ向けの高性胜数孊およびマルチメディアラむブラリを䜿甚したコンピュヌティングを高速化したす。








All Articles