é廿°å幎ã«ããã£ãŠãã³ã³ãã¥ãŒãã£ã³ã°ã·ã¹ãã ã¯ã·ã³ã°ã«ã³ã¢ã¹ã«ã©ãŒãããã«ãã³ã¢ãã¯ãã«ã¢ãŒããã¯ãã£ã«é²åããŸãããããããŒãžãèšèªãšæ°ããããã°ã©ãã³ã°èšèªã®äººæ°ã¯å€§å¹
ã«é«ãŸããŸããã ãããã髿§èœãªã³ãŒããäœæã§ããå€ãè¯ãC ++ã¯ãäŸç¶ãšããŠäººæ°ããããŸãã ãã ããæè¿ãŸã§ãèšèªæšæºã¯äžŠè¡æ§ã衚çŸããããã®ããŒã«ãæäŸããŠããŸããã§ããã æšæºã®æ°ããããŒãžã§ã³ïŒC ++ 17 [1]ïŒã¯ã䞊åParallel STLã¢ã«ãŽãªãºã ã®ã»ãããæäŸããŸããããã«ãããæ¢åã®ã·ãªã¢ã«C ++ã³ãŒãã䞊åã«å€æããããšãå¯èœã«ãªãããã«ãã¹ã¬ããããã¯ãã«åãªã©ã®ããŒããŠã§ã¢æ©èœã䜿çšã§ããããã«ãªããŸãã ãã®èšäºã§ã¯ãã€ã³ãã«Â®Parallel Studio XE 2018ã§ã®Parallel STLãšãã®å®è£
ã®åºæ¬ã玹ä»ããŸãã

ãã©ã¬ã«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) {
å³3.å
åŽã®ã«ãŒãã®Par_unseqé©ããããšã«ãå¥è·¡ã¯èµ·ãããŸããã§ããïŒå³3ïŒã
par_unseqã䜿çšããããã©ãŒãã³ã¹
㯠ãé æ¬¡å®è¡ããã
å£ããŸãã ããã¯ããã©ã¬ã«STLã䜿çšããªãæ¹æ³ã®è¯ãäŸã§ãã ããšãã°ã
ã€ã³ãã«Â®VTune Amplifier XEã䜿çšããŠã³ãŒãã®ãããã¡ã€ã«ãäœæãããšãåããã£ãã·ã¥ã©ã€ã³ã«ã¢ã¯ã»ã¹ããç°ãªãã³ã¢ã§å®è¡ãããŠããã¹ã¬ããã«èµ·å ããå€ãã®ãã£ãã·ã¥ãã¹ã確èªã§ããŸãïŒãã®å¹æã¯ããªãœãŒã¹ã®åœå
±æ "[
åœå
±æ ]ïŒã
åè¿°ã®ããã«ãParallel STLã¯ãäžéã¬ãã«ïŒã·ã¹ãã ã¹ã¬ããã䜿çšïŒãšäžäœã¬ãã«ïŒãã¯ãã«åã䜿çšïŒã®äžŠåæ§ã衚çŸããã®ã«åœ¹ç«ã¡ãŸãã äžè¬çãªå Žåãæå€§ã®å éãåŸãã«ã¯ãã¢ã«ãŽãªãºã ã®å®è¡æéãè©äŸ¡ããããã䞊ååããã³ãã¯ãã«åã®ãªãŒããŒããããšæ¯èŒããŸãã é æ¬¡å®è¡æéã¯ãååæå®è¡ã¬ãã«ã§ã®ãªãŒããŒãããããå°ãªããšã2åé·ãããããšããå§ãããŸãã ããã«å ããŠïŒ
- æé«ã¬ãã«ã䞊ååããŸãã 䞊è¡ããŠè¡ãããäœæ¥ã®æå€§éãæ¢ããŸãã
- ããã§ååãªäžŠååå¹çãåŸãããã°ãç®æšã¯éæãããŠããŸãã ããã§ãªãå Žåã¯ã以äžã®ã¬ãã«ã䞊ååããŸãã
- ã¢ã«ãŽãªãºã ããã£ãã·ã¥ãå¹ççã«äœ¿çšããŠããããšã確èªããŠãã ããã
- æäœã¬ãã«ããã¯ãã«åããŠã¿ãŠãã ããã ãã¯ãã«åããã颿°ã®æ¡ä»¶ä»ããžã£ã³ãã®æ°ãæžãããã¡ã¢ãªãžã®åäžãªã¢ã¯ã»ã¹ãç¶æããŠãã ããã
- [4]ã§ããã«æšå¥šäºé
ãæ¢ããŠãã ããã
æšå¥šäºé
ã¯ãç°ãªãã¬ãã«ã§äžŠåããã³ãã¯ãã«ããªã·ãŒãæ£ãã䜿çšãããšãããã©ãŒãã³ã¹ãåäžããããšã瀺åããŠããŸãã
void ApplyGamma(Image& rows, float g) { using namespace pstl::execution;
å³4.å
éšã¬ãã«ã§ã®ãã¯ãã«åãå€éšã¬ãã«ã§ã®äžŠååããã§ã1ã€ã®ç»åã®å¹æçãªäžŠååŠçãè¡ãããŸããïŒå³4ïŒããå®éã®ã¢ããªã±ãŒã·ã§ã³ã¯ååãšããŠå€ãã®ç»åãåŠçããŸãïŒå³5ïŒã ããé«ãã¬ãã«ã®åæå®è¡ã¯ãæšæºã®ã¢ã«ãŽãªãºã ã§ã¯ããŸãæ©èœããªãå ŽåããããŸãã ãã®å ŽåãIntel TBBãšãšãã«Parallel STLã䜿çšããããšããå§ãããŸãã
å³5.è€æ°ã®ç»åãåŠçããæ¹æ³ããã«ãããã·ã¹ãã å
ã«éå°ãªæ°ã®è«çãããŒãäœæããããšãå¿é
ããã«ãæé«ã¬ãã«ã®Intel TBBããã³äžäœã¬ãã«ã®Parallel STLã¢ã«ãŽãªãºã ãã¿ã¹ã¯ïŒã¿ã¹ã¯ïŒãŸãã¯äžŠåæ§é ïŒèšç®ã°ã©ã[ãããŒã°ã©ã]ããã€ãã©ã€ã³[ãã€ãã©ã€ã³]ãªã©ïŒã«é©çšã§ããŸãã ã äŸïŒ
void Function() { Image img1, img2;
å³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ã®ææ°ããŒãžã§ã³ãããã³æ¬¡ã®ãµã€ãã§è¿œå æ
å ±ãèŠã€ããããšãã§ããŸãã
ãã£ãŒãããã¯ãå¿
èŠã§ãã ãããŠãããªãã¯ããããããã«æ®ãããšãã§ããŸãïŒ
åç
§ïŒ
[1] ISO / IEC 14882ïŒ2017ãããã°ã©ãã³ã°èšèªã C ++
[2] n4698ã
ã¯ãŒãã³ã°ãã©ããã䞊ååããŒãžã§ã³2ã®C ++æ¡åŒµæ©èœã®æè¡ä»æ§ ãããã°ã©ãã³ã°èšèªC ++ïŒWG21ïŒ
[3] P0076r4ã
ãã¯ãã«ããã³ãŠã§ãŒãããã³ãããªã·ãŒ ãããã°ã©ãã³ã°èšèªC ++ïŒWG21ïŒ
[4] Robert Gevaã
ã³ãŒãææ°åã®ãã¹ããã©ã¯ãã£ã¹ïŒã€ã³ã㫠®Xeon®
ããã³ã€ã³ã㫠®Xeon
Phiâ¢ããã»ããµãŒã®ãã«ãã¬ãã«äžŠååŠç ãIDF15-Webcast
*ä»ã®ååããã³ãã©ã³ãã¯ãä»è
ã®ç¥ç財ç£ãšããŠå®£èšãããå ŽåããããŸãã