ãã®ãããªãã¢ã¯ã»ã©ã¬ãŒã¿ãã®è¯ãäŸã¯ã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ãã©ãããã©ãŒã ã«å°æ¥åæ§ã®æ©èœãå®è£ ã§ããŸãã å°ãªããšããã®åéã®ç 究ã¯ãã§ã«é²è¡äžã§ãã
- ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ã®SIMDãã¯ãã«åã®åè ã
- Intel Xeon Phiã³ããã»ããµãŒã䜿çšããã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ãšã³ãžã³ã®èšèš ã
ãã¹ãå°æ¬
ãã¹ãããã°ã©ã ã¯ãSolaris Studio 12.4ã³ã³ãã€ã©ã䜿çšããŠæ§ç¯ãããŸããã æ倧ã®æé©åã¬ãã«ïŒ-xO5ïŒã䜿çšãããããããå€å žçãªãèšç®ãå€§å¹ ã«é«éåã§ããŸããã ãœãŒã¹ã³ãŒãã¯githubã§å ¥æã§ããŸãã
SPARC M7ããã³DAXã¯ãOracleã®å ¬åŒãªãªãŒã¹ã§ã ã
ãã®èšäºã¯ãJet Infosystems Computer Design Centerã®ã·ã¹ãã ã¢ãŒããã¯ãã§ããDmitry Glushenkoã«ãã£ãŠäœæãããŸããã 建èšçãªã³ã¡ã³ããæè¿ããŸãã