
ãã©ã¬ã«STLã®æŠèŠ
ãã®ãããC ++ã§äžŠè¡æ§ããµããŒãããéåœã¯éåžžã«å°é£ã§ããã äžã®åçã§
ãœãããŠã§ã¢ãŸãã¯ããŒããŠã§ã¢ã¡ãŒã«ãŒã«ãã£ãŠäœæãããããŸããŸãªãå€éšã䞊åãœãããŠã§ã¢éçºããŒã«ã®ãåç©åãå šäœãå«ããC ++ã®ç°ãªãããŒãžã§ã³ã§ããã«äœ¿çšã§ãããã«ãã¬ãã«ããŒã«ã«æ £ããããšãã§ããŸãã

å³1. C ++ã§ã®äžŠè¡æ§ã®é²å
ãã©ã¬ã«STLã¯ãæšæºãã³ãã¬ãŒãã©ã€ãã©ãªïŒC ++ïŒã®æ¡åŒµæ©èœã§ããããå®è¡ããªã·ãŒãã®éèŠãªæŠå¿µãå°å ¥ããŠããŸãã
å®è¡ããªã·ãŒã¯ãSTLã¢ã«ãŽãªãºã ããªãŒããŒããŒãããããã®äžæã®ã¿ã€ããšããŠäœ¿çšãããC ++ã¯ã©ã¹ã§ãã 䜿ããããããããã«ãæšæºã§ã¯ããã®ãããªåã¯ã©ã¹ã®1ã€ã®ãªããžã§ã¯ããå®çŸ©ããŠããŸããããã¯ãã¢ã«ãŽãªãºã ãåŒã³åºããšãã«åŒæ°ãšããŠæž¡ãããšãã§ããŸãã ãããã¯ãããç¥ãããã¢ã«ãŽãªãºã ïŒtransformãfor_eachãcopy_ifïŒãšãC ++ 17ã§ç»å Žããæ°ããã¢ã«ãŽãªãºã ïŒreduceãtransform_reduceãinclusive_scanãªã©ïŒã®äž¡æ¹ã§äœ¿çšã§ããŸãã C ++ 17ã®ãã¹ãŠã®ã¢ã«ãŽãªãºã ãããªã·ãŒããµããŒãããããã§ã¯ãªãããšãæ確ã«ããå¿ èŠããããŸãã
ããã«ãã¢ã«ãŽãªãºã ã®äžŠåå®è¡ãšã¯ãããã€ãã®CPUã³ã¢ã§ã®å®è¡ãæå³ããŸãã ãã¯ãã«åãšã¯ããã¯ãã«ããã»ããµã¬ãžã¹ã¿ãå«ãå®è¡ã®ããšã§ãã 䞊åããªã·ãŒã®ãµããŒãã¯ãã䞊ååŠçã®ããã®C ++æ¡åŒµæ©èœã®æè¡ä»æ§*ãïŒäžŠååŠçTSïŒãšããŠæ°å¹ŽééçºãããŠããŸããã çŸåšããã®ä»æ§ã¯C ++ 17èšèªæšæºã®äžéšã§ãã ãã¯ãã«ããªã·ãŒã®ãµããŒãã¯ãParallelism TSä»æ§ã®ç¬¬2ããŒãžã§ã³ïŒn4698 [2]ãp0076 [3]ïŒã«å«ããããšãã§ããŸãã äžè¬ã«ããããã®ããã¥ã¡ã³ãã«ã¯5ã€ã®ç°ãªãå®è¡ããªã·ãŒãèšèŒãããŠããŸãïŒå³2ïŒã
- sequenced_policyïŒseqïŒã¯ãã¢ã«ãŽãªãºã ãé çªã«å®è¡ã§ããããšã瀺ããŸã[1]ã
- parallel_policyïŒparïŒã¯ãã¢ã«ãŽãªãºã ã䞊åã§å®è¡ã§ããããšã瀺ããŸã[1]ã ã¢ã«ãŽãªãºã ã®åäœäžã«åŒã³åºãããã«ã¹ã¿ã é¢æ°ã¯ããããŒã¿ã®ç«¶åããåŒãèµ·ããã¹ãã§ã¯ãããŸããã
- parallel_unsequenced_policyïŒpar_unseqïŒã¯ãã¢ã«ãŽãªãºã ã䞊åããã³ãã¯ãã«[1]ã§å®è¡ã§ããããšã瀺ããŸãã
- unsequenced_policyïŒunseqïŒ-Parallelism TS v2 [2]ãã©ããã®äžéšã§ãããã¢ã«ãŽãªãºã ããã¯ãã«çã«å®è¡ã§ããããšã瀺ãã¯ã©ã¹ã ãã®ããªã·ãŒã§ã¯ããã¹ãŠã®ãŠãŒã¶ãŒå®çŸ©é¢æ°ããã¡ã³ã¯ã¿ãŒããã©ã¡ãŒã¿ãŒãšããŠã¢ã«ãŽãªãºã ã«æž¡ããããã¯ãã«åã«å¹²æžããªãããšïŒããŒã¿ã®äŸåé¢ä¿ãå«ãŸãªããããŒã¿ã®ç«¶åãåŒãèµ·ãããªããªã©ïŒãå¿ èŠã§ãã
- vector_policyïŒvecïŒ ïŒããã[2]ããïŒã¯ãã¢ã«ãŽãªãºã ã¯ãã¯ã¿ãŒã§å®è¡ã§ãããšè¿°ã¹ãŠããŸããã unseqãšã¯ç°ãªãã vecããªã·ãŒã¯ãé 次å®è¡äžã«åŠçãããé åºã§ããŒã¿åŠçãä¿èšŒããŸãïŒçµåæ§ãä¿æããŸãïŒã

å³2.ã¢ã«ãŽãªãºã ã®å®è¡ããªã·ãŒ
äžã®å³ã¯ããããã®ããªã·ãŒéã®é¢ä¿ã瀺ããŠããŸãã ãã€ã¢ã°ã©ã å ã®ããªã·ãŒãé«ãã»ã©ãïŒäžŠåæ§ã«é¢ããŠïŒèªç±åºŠã倧ãããªããŸãã
以äžã¯ãC ++ 17æšæºã«åŸã£ãŠSTLããã³Parallel STLã¢ã«ãŽãªãºã ã䜿çšããäŸã§ãã
#include <execution> #include <algorithm> void increment_seq( float *in, float *out, int N ) { using namespace std; transform( in, in + N, out, []( float f ) { return f+1; }); } void increment_unseq( float *in, float *out, int N ) { using namespace std; using namespace std::execution; transform( unseq, in, in + N, out, []( float f ) { return f+1; }); } void increment_par( float *in, float *out, int N ) { using namespace std; using namespace std::execution; transform( par, in, in + N, out, []( float f ) { return f+1; }); }
ã¬ã³ãŒãã¯ã©ãã§ãã
std::transform( in, in + N, out, foo );
次ã®ã«ãŒããšåçïŒ
for (x = in; x < in+N; ++x) *(out+(x-in)) = foo(x);
ãããŠ
std::transform( unseq, in, in + N, out, foo );
次ã®ãµã€ã¯ã«ãšããŠè¡šãããšãã§ããŸãïŒç§ãã¡ã®å®è£ ã¯äžäœã¬ãã«ã§#pragma omp simdã䜿çšããä»ã®äžŠåSTLå®è£ ã¯unseqããªã·ãŒãå®è£ ããããã«ä»ã®æ¹æ³ã䜿çšããå ŽåããããŸãïŒ
#pragma omp simd for (x = in; x < in+N; ++x) *(out+(x-in)) = foo(x);
ãããŠ
std::transform( par, in, in + N, out);
次ã®ããã«è¡šçŸã§ããŸãã
tbb::parallel_for (in, in+N, [=] (x) { *(out+(x-in)) = foo(x); });
ã€ã³ãã«Â®Parallel Studio XE 2018ã§ã®äžŠåSTLå®è£ ã®æŠèŠ
ã€ã³ãã«ã®Parallel STLå®è£ ã¯ã Intel®Parallel Studio XE 2018ã®äžéšã§ãã 䞊åããã³ãã¯ãã«ã®äž¡æ¹ã§å®è¡ã§ããã¢ã«ãŽãªãºã ã®ç§»æ€å¯èœãªå®è£ ãæäŸããŸãã å®è£ ã¯ãã€ã³ãã«Â®ããã»ããµãŒåãã«æé©åããã³ãã¹ããããŠããŸãã parããã³par_unseqããªã·ãŒã䜿çšããå Žåã¯ã€ã³ãã«Â®ã¹ã¬ããã£ã³ã°ãã«ãã£ã³ã°ãããã¯ïŒã€ã³ã㫠®TBB ïŒã䜿çšãã unseqããã³par_unseqããªã·ãŒã§ã¯OpenMP *ã䜿çšãããã¯ãã«åã䜿çšããŸãã vecããªã·ãŒã¯ãIntel Parallel Studio XE 2018ã§ã¯è¡šç€ºãããŸããã
Parallel STLãã€ã³ã¹ããŒã«ãããã ãã®ããã¥ã¡ã³ãã®èª¬æã«åŸã£ãŠç°å¢å€æ°ãèšå®ããå¿ èŠããããŸã ã ãŸãã䞊åããã³/ãŸãã¯ãã¯ãã«å®è£ ãæã€ã¢ã«ãŽãªãºã ã®å®éã®ãªã¹ãããããŸãã ä»ã®ã¢ã«ãŽãªãºã ã®å Žåãå®è¡ããªã·ãŒãé©çšå¯èœã§ãããã·ãªã¢ã«ããŒãžã§ã³ãåŒã³åºãããŸãã
ãã©ã¬ã«STLå®è£ ã§æè¯ã®çµæãåŸãã«ã¯ãã€ã³ãã«Â®C ++ã³ã³ãã€ã©ãŒ2018ã®äœ¿çšããå§ãããŸãããã ããC ++ 11ããµããŒãããä»ã®ã³ã³ãã€ã©ãŒã䜿çšããããšãã§ããŸãã ãã¯ãã«åã®å©ç¹ãåŸãã«ã¯ãã³ã³ãã€ã©ãŒã¯OpenMP 4.0ïŒ #pragma omp simd ïŒããµããŒãããå¿ èŠããããŸãã parãpar_unseqããªã·ãŒã䜿çšããã«ã¯ãIntel TBBã©ã€ãã©ãªãå¿ èŠã§ãã
Parallel STLãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããã«ã¯ã次ã®æé ãå®è¡ããŸãã
- #include "pstl / execution"ãè¿œå ããŸãã 次ã«ã䜿çšããã¢ã«ãŽãªãºã ã«å¿ããŠã次ã®è¡ã®1ã€ä»¥äžãå®è¡ããŸãã
#include "pstl / algorithm"
#include "pstl / numeric"
#include "pstl / memory"
#include <execution>ã ãã§ãªãã #include "pstl / execution"ãèšè¿°ããå¿ èŠãããããšã«æ³šæããŠãã ããã ããã¯ãç¹ã«æšæºC ++ã©ã€ãã©ãªã®ããããŒãã¡ã€ã«ãšã®ç«¶åãé¿ããããã«è¡ãããŸãã - ã¢ã«ãŽãªãºã ãšããªã·ãŒã䜿çšãããå Žæã«ã€ããŠã¯ãããããåå空éstdãšpstl :: executionãæå®ããŸãã
- ãµããŒããªãã·ã§ã³C ++ 11以éã§ã³ãŒããã³ã³ãã€ã«ããŸãã é©åãªã³ã³ãã€ã«ãªãã·ã§ã³ã䜿çšããŠãOpenMPãã¯ãã«åãæå¹ã«ããŸãïŒããšãã°ãIntel C ++ã³ã³ãã€ã©ã®å Žå-qopenmp-simd ïŒWindowsã®å Žåã¯/ Qopenmp-simd *ïŒã
- æé«ã®ããã©ãŒãã³ã¹ãåŸãã«ã¯ãã¿ãŒã²ãããã©ãããã©ãŒã ãæå®ããŸãã ã€ã³ãã«Â®C ++ã³ã³ãã€ã©ãŒã®å Žåããªã¹ãããé©åãªãªãã·ã§ã³ã䜿çšããŸãïŒ -xHOSTã-xCORE-AVX2ã-xMIC-AVX512 for Linux *ãŸãã¯/ QxHOSTã/ QxCORE AVX2ã/ QxMIC-AVX512 for Windowsã
- Intel TBBãšãªã³ã¯ããŸãã Windowsã§ã¯ãããã¯èªåçã«è¡ãããŸãã ä»ã®ãã©ãããã©ãŒã ã§ã¯è¿œå
-ltbbãããªã³ã«ãŒãªãã·ã§ã³ã
Intel Parallel Studio XE 2018ã«ã¯ããã«ãããã³å®è¡ã§ããParallel STLã®äœ¿çšäŸãå«ãŸããŠããŸãã ããããããŠã³ããŒãã§ããŸã ã
Parallel STLå®è£ ã䜿çšããå¹ççãªãã¯ãã«åãåæå®è¡æ§ããã³äºææ§
çè«çã«ã¯ãParallel STLã¯ãC ++éçºè ãå ±æã¡ã¢ãªãåãã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã·ã¹ãã çšã®ããã°ã©ã ãäœæããããã®çŽæçãªæ¹æ³ãšããŠèšèšãããŸããã çè«ããã¹ããããã«ãŒãã䞊ååãããã¹ããã©ã¯ãã£ã¹ãšçžé¢ããã¢ãããŒããèããŠã¿ãŸããããããšãã°ããå éšã¬ãã«ããã¯ãã«åããå€éšã䞊ååããããªã©ã®ã¢ãããŒãã§ãïŒãInternalmostãParallelize Outermostããã¯ãã«åããã[VIPO]ïŒ[4]ã äŸãšããŠãç»åã®ã¬ã³ãè£æ£ãæ€èšããŸããããã¯ãåç»åãã¯ã»ã«ã®èŒåºŠãå€æŽããããã«äœ¿çšãããéç·åœ¢æäœã§ãã é次å®è¡ãšãã¯ãã«å®è¡ã®éãã瀺ãããã«ãã¢ã«ãŽãªãºã ã®é 次å®è¡ã®èªåãã¯ãã«åãç¡å¹ã«ããå¿ èŠãããããšã«æ³šæããŠãã ããã ïŒããã§ãªããã°ããã®éãã¯ãèªåãã¯ãã«åããµããŒãããŠããªããOpenMPãã¯ãã«åããµããŒãããŠããã³ã³ãã€ã©ã§ã®ã¿èŠãããŸãïŒ
é 次å®è¡ã®äŸãèããŠã¿ãŸãããã
#include <algorithm> void ApplyGamma(Image& rows, float g) { using namespace std; for_each(rows.begin(), rows.end(), [g](Row &r) { transform(r.cbegin(), r.cend(), r.begin(), [g](float v) { return pow(v, g); }); }); }
ApplyGammaé¢æ°ã¯ãåç §ã«ãã£ãŠäžé£ã®æååãšããŠè¡šãããç»åãååŸãã std :: for_eachãåŒã³åºããŠæååãå埩åŠçããŸãã åè¡ã«å¯ŸããŠåŒã³åºãããã©ã ãé¢æ°ã¯ã std :: transformã䜿çšããŠãã¯ã»ã«ãã«ãŒãåŠçããåãã¯ã»ã«ã®èŒåºŠãå€æŽããŸãã
åã«èª¬æããããã«ãParallel STLã¯ã for_eachããã³å€æã¢ã«ãŽãªãºã ã®äžŠåããŒãžã§ã³ãšãã¯ãã«ããŒãžã§ã³ãæäŸããŸãã ã€ãŸããã¢ã«ãŽãªãºã ã®æåã®åŒæ°ãšããŠæž¡ãããããªã·ãŒã¯ããã®ã¢ã«ãŽãªãºã ã®äžŠåããŒãžã§ã³ãŸãã¯ãã¯ã¿ãŒããŒãžã§ã³ã®å®è¡ã«ã€ãªãããŸãã
äžèšã®äŸã«æ»ããšã å€æã¢ã«ãŽãªãºã ããåŒã³åºãããã©ã ãé¢æ°ã§ãã¹ãŠã®èšç®ãå®è¡ãããããšãããããŸãã ã1ç³ã§2矜ã®é³¥ã殺ããããšãè©Šã¿ã par_unseqããªã·ãŒã䜿çšããŠäŸãæžãæããŸãããã
void ApplyGamma(Image& rows, float g) { using namespace pstl::execution; std::for_each(rows.begin(),rows.end(), [g](Row &r) { // Inner parallelization and vectorization std::transform(par_unseq, r.cbegin(), r.cend(), r.begin(), [g](float v) { return pow(v, g); }); }); }

å³3.å åŽã®ã«ãŒãã®Par_unseq
é©ããããšã«ãå¥è·¡ã¯èµ·ãããŸããã§ããïŒå³3ïŒã par_unseqã䜿çšããããã©ãŒãã³ã¹ã¯ ãé 次å®è¡ãããå£ããŸãã ããã¯ããã©ã¬ã«STLã䜿çšããªãæ¹æ³ã®è¯ãäŸã§ãã ããšãã°ã ã€ã³ãã«Â®VTune Amplifier XEã䜿çšããŠã³ãŒãã®ãããã¡ã€ã«ãäœæãããšãåããã£ãã·ã¥ã©ã€ã³ã«ã¢ã¯ã»ã¹ããç°ãªãã³ã¢ã§å®è¡ãããŠããã¹ã¬ããã«èµ·å ããå€ãã®ãã£ãã·ã¥ãã¹ã確èªã§ããŸãïŒãã®å¹æã¯ããªãœãŒã¹ã®åœå ±æ "[ åœå ±æ ]ïŒã
åè¿°ã®ããã«ãParallel STLã¯ãäžéã¬ãã«ïŒã·ã¹ãã ã¹ã¬ããã䜿çšïŒãšäžäœã¬ãã«ïŒãã¯ãã«åã䜿çšïŒã®äžŠåæ§ãè¡šçŸããã®ã«åœ¹ç«ã¡ãŸãã äžè¬çãªå Žåãæ倧ã®å éãåŸãã«ã¯ãã¢ã«ãŽãªãºã ã®å®è¡æéãè©äŸ¡ããããã䞊ååããã³ãã¯ãã«åã®ãªãŒããŒããããšæ¯èŒããŸãã é 次å®è¡æéã¯ãååæå®è¡ã¬ãã«ã§ã®ãªãŒããŒãããããå°ãªããšã2åé·ãããããšããå§ãããŸãã ããã«å ããŠïŒ
- æé«ã¬ãã«ã䞊ååããŸãã 䞊è¡ããŠè¡ãããäœæ¥ã®æ倧éãæ¢ããŸãã
- ããã§ååãªäžŠååå¹çãåŸãããã°ãç®æšã¯éæãããŠããŸãã ããã§ãªãå Žåã¯ã以äžã®ã¬ãã«ã䞊ååããŸãã
- ã¢ã«ãŽãªãºã ããã£ãã·ã¥ãå¹ççã«äœ¿çšããŠããããšã確èªããŠãã ããã
- æäœã¬ãã«ããã¯ãã«åããŠã¿ãŠãã ããã ãã¯ãã«åãããé¢æ°ã®æ¡ä»¶ä»ããžã£ã³ãã®æ°ãæžãããã¡ã¢ãªãžã®åäžãªã¢ã¯ã»ã¹ãç¶æããŠãã ããã
- [4]ã§ããã«æšå¥šäºé ãæ¢ããŠãã ããã
æšå¥šäºé ã¯ãç°ãªãã¬ãã«ã§äžŠåããã³ãã¯ãã«ããªã·ãŒãæ£ãã䜿çšãããšãããã©ãŒãã³ã¹ãåäžããããšã瀺åããŠããŸãã
void ApplyGamma(Image& rows, float g) { using namespace pstl::execution; // Outer parallelization std::for_each(par, rows.begin(), rows.end(), [g](Row &r) { // Inner vectorization std::transform(unseq, r.cbegin(), r.cend(), r.begin(), [g](float v) { return pow(v, g); }); }); }

å³4.å éšã¬ãã«ã§ã®ãã¯ãã«åãå€éšã¬ãã«ã§ã®äžŠåå
ããã§ã1ã€ã®ç»åã®å¹æçãªäžŠååŠçãè¡ãããŸããïŒå³4ïŒããå®éã®ã¢ããªã±ãŒã·ã§ã³ã¯ååãšããŠå€ãã®ç»åãåŠçããŸãïŒå³5ïŒã ããé«ãã¬ãã«ã®åæå®è¡ã¯ãæšæºã®ã¢ã«ãŽãªãºã ã§ã¯ããŸãæ©èœããªãå ŽåããããŸãã ãã®å ŽåãIntel TBBãšãšãã«Parallel STLã䜿çšããããšããå§ãããŸãã

å³5.è€æ°ã®ç»åãåŠçããæ¹æ³
ããã«ãããã·ã¹ãã å ã«éå°ãªæ°ã®è«çãããŒãäœæããããšãå¿é ããã«ãæé«ã¬ãã«ã®Intel TBBããã³äžäœã¬ãã«ã®Parallel STLã¢ã«ãŽãªãºã ãã¿ã¹ã¯ïŒã¿ã¹ã¯ïŒãŸãã¯äžŠåæ§é ïŒèšç®ã°ã©ã[ãããŒã°ã©ã]ããã€ãã©ã€ã³[ãã€ãã©ã€ã³]ãªã©ïŒã«é©çšã§ããŸãã ã äŸïŒ
void Function() { Image img1, img2; // Prepare img1 and img2 tbb::parallel_invoke( [&img1] { img1.ApplyGamma(gamma1); }, [&img2] { img2.ApplyGamma(gamma2); } ); }

å³6. Intel TBBãšãã©ã¬ã«STLã®å ±æ
å³6ã«ç€ºãããã«ãIntel TBBã䜿çšããŠ2ã€ã®ã€ã¡ãŒãžãåæã«åŠçããŠãããã©ãŒãã³ã¹ã¯äœäžããŸããããéã«ãããã«åäžããŸãã ããã¯ãããäœãã¬ãã«ããã³ããäœãã¬ãã«ã§äžŠè¡æ§ãè¡šçŸãããšãCPUã³ã¢ãæ倧éã«æŽ»çšã§ããããšã瀺ããŠããŸãã
ããã§ãåŠççšã®ã€ã¡ãŒãžãšCPUã³ã¢ãå¢ããç¶æ³ãèããŠã¿ãŸãããã
tbb::parallel_for(images.begin(), images.end(), [](image* img) {applyGamma(img->rows(), 1.1);} );

å³7.ããå€ãã®ã€ã¡ãŒãžãšããå€ãã®CPUã³ã¢ã§Intel TBBãšParallel STLãå ±æããŸãã
äžã®å³ã¯ãIntel TBBïŒ parallel_for ïŒã䜿çšããŠè€æ°ã®ã€ã¡ãŒãžãåæã«åŠçãããšçç£æ§ãåçã«åäžããããšã瀺ããŠããŸãã å®éãæåã®åãèŠãŠãã ããããã¹ãŠã®ç»åãé çªã«å®è¡ããåç»åãäžäœã¬ãã«ã§äžŠååŠçãããŠããŸãã æäžäœã¬ãã«ïŒ par ïŒã§äžŠååŠçãè¡ããã«ãæé«ã¬ãã«ïŒ parallel_for ïŒã§ã®ã¿äžŠååŠçãè¿œå ãããšãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãããããã¯CPUã³ã¢ã®ãªãœãŒã¹ãæ倧éã«æŽ»çšããã«ã¯äžååã§ãã 3çªç®ã®åã¯ããã¹ãŠã®ã¬ãã«ã§ã®äžŠè¡æ§ãçç£æ§ãåçã«åäžãããããšã瀺ããŠããŸãã ããã¯ãã€ã³ãã«TBBãšãã©ã¬ã«STLå®è£ ã®å ±æã®æå¹æ§ã瀺ããŠããŸãã
ãããã«
䞊åSTLã¯ãC ++䞊ååŠçã®é²åã«ãããéèŠãªã¹ãããã§ãããã³ãŒãã®è¿ä»£åäžããã³æ°ããã¢ããªã±ãŒã·ã§ã³ã®äœæäžã®äž¡æ¹ã§ãæšæºSTLã©ã€ãã©ãªã®ã¢ã«ãŽãªãºã ã«å®¹æã«é©çšã§ããŸãã æšæºã®ãã®éšåã¯ãéæšæºãŸãã¯æ±çšã®æ¡åŒµæ©èœã䜿çšããã«ããã¯ãã«åãšäžŠååŠçã®æ©èœãC ++èšèªã«è¿œå ããå®è¡ããªã·ãŒã¯ããŒããŠã§ã¢ããæœè±¡åããŠããã®ãããªæ©èœã®äœ¿çšãå¶åŸ¡ããŸãã 䞊åSTLã䜿çšãããšãéçºè ã¯äœã¬ãã«ã®ãããŒå¶åŸ¡ãšãã¯ãã«ã¬ãžã¹ã¿ãå¿é ããããšãªããã¢ããªã±ãŒã·ã§ã³ã®åæå®è¡æ§ã®è¡šçŸã«éäžã§ããŸãã é«ã¬ãã«ã¢ã«ãŽãªãºã ã®å¹ççã§é«æ§èœãªå®è£ ã«å ããŠããã©ã¬ã«STLå®è£ ã¯ãã€ã³ãã«TBBãã©ã¬ã«ãã¿ãŒã³ãšã®å¹ççãªå ±æãå®èšŒããŸãã ãã ããParallel STLã¯äžèœè¬ã§ã¯ãããŸããã ã¿ã¹ã¯ã®æ¬¡å ãããŒã¿ã®ã¿ã€ããšéãããã³é¢æ°ã®ã³ãŒããã¢ã«ãŽãªãºã ã§äœ¿çšããããã¡ã³ã¯ã¿ãŒã«å¿ããŠã䞊åããªã·ãŒãšãã¯ãã«ããªã·ãŒãæ éã«äœ¿çšããå¿ èŠããããŸãã é«ãããã©ãŒãã³ã¹ãå®çŸããã«ã¯ã[4]ã§èª¬æãããŠããããã€ãã®æ¹æ³ããå§ãããŸãã
Parallel STLããã³Intel TBBã®ææ°ããŒãžã§ã³ãããã³æ¬¡ã®ãµã€ãã§è¿œå æ å ±ãèŠã€ããããšãã§ããŸãã
- githubã§ã®Parallel STLã®ãªãŒãã³ãœãŒã¹å®è£
- ã€ã³ãã«TBBã®å ¬åŒWebãµã€ã
- githubäžã®Intel TBB
- Intel TBB ããã¥ã¡ã³ã
ãã£ãŒãããã¯ãå¿ èŠã§ãã ãããŠãããªãã¯ããããããã«æ®ãããšãã§ããŸãïŒ
åç §ïŒ
[1] ISO / IEC 14882ïŒ2017ãããã°ã©ãã³ã°èšèªã C ++
[2] n4698ã ã¯ãŒãã³ã°ãã©ããã䞊ååããŒãžã§ã³2ã®C ++æ¡åŒµæ©èœã®æè¡ä»æ§ ãããã°ã©ãã³ã°èšèªC ++ïŒWG21ïŒ
[3] P0076r4ã ãã¯ãã«ããã³ãŠã§ãŒãããã³ãããªã·ãŒ ãããã°ã©ãã³ã°èšèªC ++ïŒWG21ïŒ
[4] Robert Gevaã ã³ãŒãææ°åã®ãã¹ããã©ã¯ãã£ã¹ïŒã€ã³ã㫠®Xeon® ããã³ã€ã³ã㫠®Xeon Phiâ¢ããã»ããµãŒã®ãã«ãã¬ãã«äžŠååŠç ãIDF15-Webcast
*ä»ã®ååããã³ãã©ã³ãã¯ãä»è ã®ç¥ç財ç£ãšããŠå®£èšãããå ŽåããããŸãã