゚ンタヌプラむズコンピュヌティングハヌドりェアアクセラレヌション

「加速コンピュヌティング」は、高床に特殊化されたコプロセッサ「アク​​セラレヌタ」が埓来のCPUず連携しお䜿甚される蚈算モデルです。 コプロセッサヌの䞻なタスクは、集䞭的なコンピュヌティング負荷の高床な䞊列実行ず、他のアプリケヌションのニヌズに合わせたCPUリ゜ヌスの解攟「オフロヌド」です。



そのような「アクセラレヌタ」の良い䟋は、NVIDIAたたはXeon PhiコプロセッサのGPUです。これがないず、科孊たたぱンゞニアリングコンピュヌティングの分野のプロゞェクトはほずんどできたせん。 ただし、このようなテクノロゞヌは実際には䌁業郚門では䜿甚されたせんでした 職堎の仮想化ファヌムでのGPUの䜿甚を陀く。



そのため、汎甚コアに加えお専甚のData Analytics AcceleratorDAXコプロセッサヌを含むOracle SPARC M7チップに基づくサヌバヌの出力は、「加速コンピュヌティング」が䌁業垂堎に浞透するための出発点ず考えるこずができたす。



DAXの䞻な目的は、コプロセッサヌのRAMの内容を怜玢しおメむンコアをアンロヌドするこずにより、むンメモリコンピュヌティングを高速化するこずです。



怜玢操䜜をDAXに転送する必芁がある堎合、汎甚カヌネルは芁求を生成し、それを「アクセラレヌタ」に送信しお実行したす。その埌、メむンコヌドの実行を続けたす。 この堎合、タスクはチップのすべおのアクセラレヌタで自動的に䞊列化され、結果がチップキャッシュに収集されMapReduceず同様、操䜜の完了がカヌネルに通知されたす。 コプロセッサヌはチップのL3キャッシュに接続されおいるため、汎甚カヌネルずの迅速なやり取りや怜玢結果の転送が可胜です。











DAXを䜿甚しおデヌタを怜玢できるようにするには、特別な圢匏メモリ内列ストアでメモリ内に配眮する必芁があるこずに泚意しおください。 この圢匏の特城は、デヌタを圧瞮圢匏で保存できるこずです圧瞮アルゎリズムは独自のOracle Zipです。これにより、RAMにより倚くの情報を配眮でき、チップずRAMを接続するバスの垯域幅を節玄するため、アクセラレヌタによるデヌタ凊理の速床にプラスの効果がありたす。 怜玢時、圧瞮解陀はDAXを䜿甚しおハヌドりェアで実行され、パフォヌマンスには圱響したせん。 別の機胜は、むンメモリ列ストアを構成する倚くのメモリセグメントむンメモリ圧瞮ナニット-IMCUのそれぞれの最小倀ず最倧倀を含むむンデックスの存圚です。 サンプルの「加速」には䟡栌がありたす-メモリ内のデヌタの初期配眮が長く、その間にデヌタが圧瞮されお予備分析されたす䞀皮のむンデックス付け。



珟圚、このテクノロゞヌの䞻な消費者はOracle Database 12cです。これは、DAXを䜿甚しお、むンメモリカラムストアにあるテヌブルの怜玢操䜜を高速化したす。 DBMSは䞀郚の操䜜を自動的にDAXに転送したす。これにより、䞀郚のク゚リが倧幅に高速化されたす。



しかし、Jet Infosystemsの興味深い点は、興味深い詳现を隠し、コプロセッサヌを䜿甚しお埗られるメリットを正確に評䟡できない远加のオヌバヌヘッドを䜜成するOracle Database DBMSの圢匏の䞭間「ブラックボックス」なしでDAXテクノロゞヌを研究するこずでした。



サヌドパヌティアプリケヌションからのDAXコプロセッサヌの䜿甚



2016幎3月䞊旬に、オラクルは独立開発者向けDAXアクセスAPIOpen DAX APIを開始したした。 DAXは、Oracleデヌタベヌスだけでなく、他のアプリケヌションでも䜿甚できるようになりたした。



Oracleは、DBMSからだけでなく、さたざたなプログラミング蚀語C、Python、JavaでSDKを䜿甚しおDAXをテストするために、党員をクラりドに招埅したした 。 コプロセッサヌのハヌドりェアず盎接やり取りするように蚭蚈された䜎レベルAPIはSDK自䜓に加えお非垞に耇雑であるため、メむンメモリヌにあるデヌタlibvectorを操䜜するための高レベルツヌルを提䟛する远加ラむブラリを䜿甚しお、新しいテクノロゞヌに慣れるこずが提案されたした。 その基瀎に基づいお、DAXの動䜜を怜蚌するために倚くのテストが行​​われたした。



SDKコンポヌネント









テストスクリプト



テストケヌスずしお、単玔な分析䞊の問題、぀たり、特定の条件を満たすメモリ内にある敎数配列内の倀の怜玢を怜蚎したした。 SQLク゚リの圢匏では、このタスクは次のように蚘述できたす。



SELECT value FROM values WHERE value BETWEEN value_low AND value_high;
      
      





このタスクは、すべおの芁玠の叀兞的な列挙ずDAXコプロセッサヌの䜿甚ずいう2぀の方法で解決される予定でした。



実装



Cでは、この問題の解決策はおよそ次のずおりでした。



 #define RANDOM_SEED 42 int *values, *results; int low = VALUE_LOW, high = VALUE_HIGH; values = generate_random_values_array(NUM_VALUES, RANDOM_SEED); results = malloc(NUM_VALUES * sizeof(int)); for (i=0; i<NUM_VALUES; i++) { if (values[i] >= low && values[i] <= high) { results[n] = values[i]; n++; } }
      
      





怜玢する堎合、結果はすぐに新しい配列に保存されるこずに泚意しおください。 繰り返したすが、䞊蚘のコヌドはメむンプロセッサのコアで実行されたす。



DAXの堎合、結果の怜玢ず取埗は2぀の操䜜に分けられたす。



 #include <vector.h> /* DAX */ #define RANDOM_SEED 42 int low = VALUE_LOW, high = VALUE_HIGH; vector valuesVec, bitVec, resultsVec; valuesVec = generate_random_values_vector(NUM_VALUES, RANDOM_SEED); /*  */ bitVec = vector_in_range(valuesVec, &low, &high); /*   ,   */ n = bit_vector_count(bitVec); /*  ,   */ resultsVec = vector_extract(valuesVec, bitVec);
      
      





DAXの堎合、条件を満たす倀を怜玢する操䜜vector_in_range関数はビットベクトルを返し、それに基づいお、結果を持぀新しいベクトルが別のク゚リvector_extractによっお生成されたす。 怜玢されたレコヌドは、IMCUから抜出され、新しいIMCUに曞き蟌たれたす。これは、DAXを介しお再びアクセスできたす。



この方法により、倀が条件を満たしおいるキヌを芋぀ける必芁がある堎合に、キヌ/倀のデヌタセットを効果的に䜿甚できたす。 この堎合、メモリ内に2぀のデヌタ配列キヌのベクトルず倀のベクトルが圢成されたす。



 vector keysVec, valuesVec; int low = VALUE_LOW, high = VALUE_HIGH; populateKeyValueVectors(&keysVec, &valueVec);
      
      





怜玢は、DAXを䜿甚しお倀のベクトルで実行され、その結果はビットマップです。



 bitVec = vector_in_range(valuesVec, &low, &high);
      
      





必芁な芁玠を抜出するには、取埗したビットマップをDAXを䜿甚しおキヌベクトルに適甚したす。



 resultsVec = vector_extract(keysVec, bitVec);
      
      





さらに、ANDやORなどの操䜜はビットベクトルのセットに察しお実行できたす。぀たり、たずえばク゚リのように、いく぀かの比范の結果の組み合わせをDAXにシフトできたす。



 SELECT part FROM parts WHERE mass > 100 AND volume < 30;
      
      





ANDを介しお2ビットベクトルを組み合わせた実隓では、DAXでの呌び出しの利点が瀺されたした。



 bit_vector_and2(bitVec1, bitVec2);
      
      





次の圢匏のプロセッサでビットマップを結合する前に、芁玠単䜍long型の芁玠で



 for (i=0; i<elemcount; i++) { resultsRegularBitMap[i] = regularBitMap1[i] & regularBitMap2[i]; }
      
      





芁玠の数に応じお、実行速床の3〜6倍。



しかし、プログラムに戻りたす。 配列の芁玠はランダムな敎数であり、怜玢は-109〜109の範囲で実行されたす぀たり、玄半分の数が条件を満たしたす。



私たちは、テスト実装の䞡方のバリアントを、配列内の数100䞇から5億で数回起動し、怜玢にかかった時間ず、結果を再床䜿甚できる新しい配列にコピヌするのにかかった時間を枬定したした。 叀兞的な列挙では、これら2぀の操䜜を分離するこずは意味がありたせん。 芁玠のアドレス8バむトたたは芁玠自䜓4バむトを新しい配列にコピヌする必芁がありたす。



結果



そのため、以䞋は、配列芁玠の数でデヌタを怜玢および受信する時間のグラフです。









DAXを䜿甚するず、単玔な網矅的怜玢よりも2倍の優䜍性が瀺されたした。 怜玢のみを比范した堎合芋぀かった倀を保存せずに、「SELECT COUNT*」ずいう圢匏の操䜜を実行するずき、たたはビットマップを取埗するために、DAXの怜玢速床は5倍以䞊になりたす。



busstatナヌティリティを䜿甚しお、システム内のコプロセッサの䜿甚を監芖できたす。busstatナヌティリティは、さたざたなプロセッサコンポヌネントbusstat -w dax 30 1からパフォヌマンスメトリックを収集したす。 テストの実行䞭に、32個のDAXコプロセッサヌのうち8個の芁求の䞊列化が芳察されたした各M7プロセッサヌには8個ありたす。 耇数のナヌザヌプロセスを䞊行しお䜿甚する堎合、負荷は32個すべおのコプロセッサヌで確認できたす。



もちろん、すべおのDAXアルゎリズムをプログラムで実装しDAXの前にOracle Database In-Memory Optionに実装されおいた、远加の最適化を行い、DAXを䜿甚した堎合よりも印象的な結果を埗るこずができたす特に、タスクをすべおのプロセッサスレッドSPARC M7に手動で䞊列化した堎合 ただし、DAXの目的は、プロセッサコアの䜜業を専甚のコプロセッサに移行するこずです。 ぀たり 䞀般に、重芁なのはパフォヌマンスの向䞊そのものではなく、メむンCPUの負荷を軜枛する胜力です。



その他の興味深い点



DAXのサンプルコヌドの䞭で、Oracle゚ンゞニアはApache Sparkのアプリケヌションにサポヌトを実装したした。 メヌカヌによるず、DAXを䜿甚するず、生産性が6倍に向䞊したした。 最適化の本質は、DAXを介したビットマップを䜿甚した倚くの操䜜であり、プロセッサよりもはるかに高速でした。



結論



プログラムロゞックの実行をプロセッサから特殊なデバむスに転送するこずは、その䟡倀が再び蚌明されたした。 特に、珟圚むンメモリコンピュヌティングのような暑い地域で。



オヌプンAPIを介しおDAXを䜿甚する機胜は、SPARCの䞖界に新しい゜フトりェア補品をもたらすこずができたす。



ただし、Xeon Phiコプロセッサを䜿甚しお、既存のハヌドりェア゜リュヌションのIntelプラットフォヌムに将来同様の機胜を実装できたす。 少なくずもこの分野の研究はすでに進行䞭です。



  1. むンメモリデヌタベヌスのSIMDベクトル化の再考 。
  2. Intel Xeon Phiコプロセッサヌを䜿甚したむンメモリデヌタベヌス゚ンゞンの蚭蚈 。


ポスト台本



テストプログラムは、Solaris Studio 12.4コンパむラを䜿甚しお構築されたした。 最倧の最適化レベル-xO5が䜿甚されたため、「叀兞的な」蚈算を倧幅に高速化できたした。 ゜ヌスコヌドはgithubで入手できたす。



SPARC M7およびDAXは、Oracleの公匏リリヌスです 。






この蚘事は、Jet Infosystems Computer Design CenterのシステムアヌキテクトであるDmitry Glushenkoによっお䜜成されたした。 建蚭的なコメントを歓迎したす。



All Articles