OpenMPãšMPIã§äžŠåã³ã³ãã¥ãŒãã£ã³ã°ã®äžçãæ¢æ±ããŸãããããããã®åŒ·åãªããŒã«ã掻çšããŠãã¢ããªã±ãŒã·ã§ã³ãé«éåããè€éãªåé¡ãå¹ççã«è§£æ±ºããæ¹æ³ãåŠã³ãŸãã
䞊åã³ã³ãã¥ãŒãã£ã³ã°ïŒOpenMPãšMPIã®è©³çް
仿¥ã®ããŒã¿é§ååäžçã§ã¯ãèšç®èœåã«å¯ŸããéèŠãçµ¶ããå¢å ããŠããŸããç§åŠã·ãã¥ã¬ãŒã·ã§ã³ããæ©æ¢°åŠç¿ã¢ãã«ãŸã§ãå€ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãèšå€§ãªéã®ããŒã¿ãåŠçããããè€éãªèšç®ãå®è¡ãããããå¿ èŠããããŸãã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã¯ãåé¡ãããå°ããªãµãåé¡ã«åå²ããããããåæã«è§£æ±ºããããšã§ãå®è¡æéãå€§å¹ ã«ççž®ãããšãã匷åãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã§æãåºã䜿çšãããŠãã2ã€ã®ãã©ãã€ã ã¯ãOpenMPãšMPIã§ãããã®èšäºã§ã¯ããããã®ãã¯ãããžãŒã®å æ¬çãªæŠèŠããã®é·æãšçæãããã³çŸå®äžçã®åé¡ã解決ããããã«ã©ã®ããã«é©çšã§ãããã«ã€ããŠèª¬æããŸãã
䞊åã³ã³ãã¥ãŒãã£ã³ã°ãšã¯ïŒ
䞊åã³ã³ãã¥ãŒãã£ã³ã°ã¯ãè€æ°ã®ããã»ããµãŸãã¯ã³ã¢ãåæã«æ©èœããŠåäžã®åé¡ã解決ããèšç®æè¡ã§ããåœä»€ã1ã€ãã€å®è¡ãããã·ãŒã±ã³ã·ã£ã«ã³ã³ãã¥ãŒãã£ã³ã°ãšã¯å¯Ÿç §çã§ããåé¡ãããå°ããç¬ç«ããéšåã«åå²ããããšã«ããã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã¯ããœãªã¥ãŒã·ã§ã³ãåŸãããã«å¿ èŠãªæéãåçã«ççž®ã§ããŸããããã¯ã次ã®ãããªèšç®éçŽåã®ã¿ã¹ã¯ã«ç¹ã«åœ¹ç«ã¡ãŸãã
- ç§åŠã·ãã¥ã¬ãŒã·ã§ã³ïŒæ°è±¡ãã¿ãŒã³ãæµäœååŠãååçžäºäœçšãªã©ã®ç©ççŸè±¡ã®ã·ãã¥ã¬ãŒã·ã§ã³ã
- ããŒã¿åæïŒå€§èŠæš¡ãªããŒã¿ã»ãããåŠçããŠãåŸåããã¿ãŒã³ãããã³æŽå¯ãç¹å®ããŸãã
- æ©æ¢°åŠç¿ïŒå€§èŠæš¡ãªããŒã¿ã»ããã§è€éãªã¢ãã«ããã¬ãŒãã³ã°ããŸãã
- ç»åãšãããªã®åŠçïŒãªããžã§ã¯ãæ€åºããããªãšã³ã³ãŒãã£ã³ã°ãªã©ã倧ããªç»åãŸãã¯ãããªã¹ããªãŒã ã§æäœãå®è¡ããŸãã
- éèã¢ããªã³ã°ïŒéèåžå Žã®åæãããªããã£ãã®äŸ¡æ Œèšå®ããªã¹ã¯ç®¡çã
OpenMPïŒå ±æã¡ã¢ãªã·ã¹ãã çšã®äžŠåããã°ã©ãã³ã°
OpenMPïŒOpen Multi-ProcessingïŒã¯ãå ±æã¡ã¢ãªäžŠåããã°ã©ãã³ã°ããµããŒãããAPIïŒApplication Programming InterfaceïŒã§ããããã¯ãè€æ°ã®ã³ã¢ãŸãã¯ããã»ããµãæã€åäžã®ãã·ã³ã§å®è¡ããã䞊åã¢ããªã±ãŒã·ã§ã³ãéçºããããã«äž»ã«äœ¿çšãããŸããOpenMPã¯ããã¹ã¿ãŒ ã¹ã¬ãããã³ãŒãã®äžŠåé åãå®è¡ããããã«ã¹ã¬ããã®ããŒã ãçæãããã©ãŒã¯ãžã§ã€ã³ ã¢ãã«ã䜿çšããŸãããããã®ã¹ã¬ããã¯åãã¡ã¢ãªç©ºéãå ±æãããããããŒã¿ã«ç°¡åã«ã¢ã¯ã»ã¹ããŠå€æŽã§ããŸãã
OpenMPã®äž»ãªæ©èœïŒ
- å ±æã¡ã¢ãªãã©ãã€ã ïŒã¹ã¬ããã¯ãå ±æã¡ã¢ãªã®å Žæã«èªã¿æžãããããšã§éä¿¡ããŸãã
- ãã£ã¬ã¯ãã£ãããŒã¹ã®ããã°ã©ãã³ã°ïŒOpenMPã¯ãã³ã³ãã€ã© ãã£ã¬ã¯ãã£ãïŒãã©ã°ãïŒã䜿çšããŠã䞊åé åãã«ãŒãå埩ãããã³åæã¡ã«ããºã ãæå®ããŸãã
- èªå䞊ååïŒã³ã³ãã€ã©ã¯ãç¹å®ã®ã«ãŒããŸãã¯ã³ãŒãé åãèªåçã«äžŠååã§ããŸãã
- ã¿ã¹ã¯ã¹ã±ãžã¥ãŒãªã³ã°ïŒOpenMPã¯ãå©çšå¯èœãªã¹ã¬ããéã§ã¿ã¹ã¯ãã¹ã±ãžã¥ãŒã«ããã¡ã«ããºã ãæäŸããŸãã
- åæããªããã£ãïŒOpenMPã¯ãããŒã¿ã®äžè²«æ§ã確ä¿ããç«¶åç¶æ ãåé¿ããããã«ãããã¯ãããªã¢ãªã©ã®ããŸããŸãªåæããªããã£ããæäŸããŸãã
OpenMPãã£ã¬ã¯ãã£ãïŒ
OpenMPãã£ã¬ã¯ãã£ãã¯ãã¢ããªã±ãŒã·ã§ã³ã䞊ååããããã«ã³ã³ãã€ã©ãã¬ã€ãããããã«ãœãŒã¹ ã³ãŒãã«æ¿å
¥ãããç¹å¥ãªåœä»€ã§ãããããã®ãã£ã¬ã¯ãã£ãã¯éåžžã#pragma ompã§å§ãŸããŸããæãäžè¬çã«äœ¿çšãããOpenMPãã£ã¬ã¯ãã£ãã«ã¯ã次ã®ãããªãã®ããããŸãã
#pragma omp parallelïŒã³ãŒããè€æ°ã®ã¹ã¬ããã«ãã£ãŠå®è¡ããã䞊åé åãäœæããŸãã#pragma omp forïŒã«ãŒãã®å埩ãè€æ°ã®ã¹ã¬ããéã§åæ£ããŸãã#pragma omp sectionsïŒã³ãŒããç¬ç«ããã»ã¯ã·ã§ã³ã«åå²ãããããããå¥ã®ã¹ã¬ããã«ãã£ãŠå®è¡ãããŸãã#pragma omp singleïŒããŒã å ã®1ã€ã®ã¹ã¬ããã ããå®è¡ããã³ãŒãã®ã»ã¯ã·ã§ã³ãæå®ããŸãã#pragma omp criticalïŒç«¶åç¶æ ãåé¿ããããã«ãäžåºŠã«1ã€ã®ã¹ã¬ããã ããå®è¡ããã³ãŒãã®ã¯ãªãã£ã«ã« ã»ã¯ã·ã§ã³ãå®çŸ©ããŸãã#pragma omp atomicïŒå ±æå€æ°ã®ã¢ãããã¯æŽæ°ã¡ã«ããºã ãæäŸããŸãã#pragma omp barrierïŒããŒã å ã®ãã¹ãŠã®ã¹ã¬ãããåæããããã¹ãŠã®ã¹ã¬ãããç¶è¡ããåã«ã³ãŒãã®ç¹å®ã®ãã€ã³ãã«å°éããããã«ããŸãã#pragma omp masterïŒãã¹ã¿ãŒ ã¹ã¬ããã ããå®è¡ããã³ãŒãã®ã»ã¯ã·ã§ã³ãæå®ããŸãã
OpenMPã®äŸïŒã«ãŒãã®äžŠåå
OpenMPã䜿çšããŠãé åå ã®èŠçŽ ã®åèšãèšç®ããã«ãŒãã䞊ååããç°¡åãªäŸãèããŠã¿ãŸãããã
#include <iostream>
#include <vector>
#include <numeric>
#include <omp.h>
int main() {
int n = 1000000;
std::vector<int> arr(n);
std::iota(arr.begin(), arr.end(), 1); // Fill array with values from 1 to n
long long sum = 0;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < n; ++i) {
sum += arr[i];
}
std::cout << "Sum: " << sum << std::endl;
return 0;
}
ãã®äŸã§ã¯ã#pragma omp parallel for reduction(+:sum)ãã£ã¬ã¯ãã£ãã¯ãã³ã³ãã€ã©ã«ã«ãŒãã䞊ååããsum倿°ã«å¯ŸããŠreductionæäœãå®è¡ããããã«æç€ºããŸããreduction(+:sum)å¥ã¯ãåã¹ã¬ãããsum倿°ã®ç¬èªã®ããŒã«ã« ã³ããŒãæã¡ããããã®ããŒã«ã« ã³ããŒãã«ãŒãã®æåŸã«å ç®ãããŠæçµçãªçµæãçæãããããã«ããŸããããã«ãããç«¶åç¶æ
ãåé¿ãããåèšãæ£ããèšç®ãããŸãã
OpenMPã®å©ç¹ïŒ
- 䜿ããããïŒOpenMPã¯ããã£ã¬ã¯ãã£ãããŒã¹ã®ããã°ã©ãã³ã°ã¢ãã«ã®ãããã§ãæ¯èŒçç°¡åã«åŠç¿ããŠäœ¿çšã§ããŸãã
- ã€ã³ã¯ãªã¡ã³ã¿ã«äžŠååïŒæ¢åã®ã·ãŒã±ã³ã·ã£ã«ã³ãŒãã¯ãOpenMPãã£ã¬ã¯ãã£ãã远å ããããšã§æ®µéçã«äžŠååã§ããŸãã
- ç§»æ€æ§ïŒOpenMPã¯ãã»ãšãã©ã®äž»èŠãªã³ã³ãã€ã©ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ãµããŒããããŠããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒOpenMPã¯ãäžçšåºŠã®æ°ã®ã³ã¢ãæã€å ±æã¡ã¢ãªã·ã¹ãã ã§ããŸãã¹ã±ãŒãªã³ã°ã§ããŸãã
OpenMPã®æ¬ ç¹ïŒ
- ã¹ã±ãŒã©ããªãã£ã®å¶éïŒOpenMPã¯ã忣ã¡ã¢ãªã·ã¹ãã ããé«åºŠã®äžŠååŠçãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã«ã¯é©ããŠããŸããã
- å ±æã¡ã¢ãªã®å¶éïŒå ±æã¡ã¢ãªãã©ãã€ã ã¯ãããŒã¿ã¬ãŒã¹ããã£ãã·ã¥ã³ããŒã¬ã³ã¹ãªã©ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- ãããã°ã®è€éãïŒOpenMPã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã¯ãããã°ã©ã ã®åæå®è¡ãšããæ§è³ªã®ããã«å°é£ã«ãªãå¯èœæ§ããããŸãã
MPIïŒåæ£ã¡ã¢ãªã·ã¹ãã çšã®äžŠåããã°ã©ãã³ã°
MPIïŒMessage Passing InterfaceïŒã¯ãã¡ãã»ãŒãžããã·ã³ã°äžŠåããã°ã©ãã³ã°ã®æšæºåãããAPIã§ããããã¯ãã³ã³ãã¥ãŒã¿ãŒã®ã¯ã©ã¹ã¿ãŒãã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒãªã©ã®åæ£ã¡ã¢ãªã·ã¹ãã ã§å®è¡ããã䞊åã¢ããªã±ãŒã·ã§ã³ãéçºããããã«äž»ã«äœ¿çšãããŸããMPIã§ã¯ãåããã»ã¹ã¯ç¬èªã®ãã©ã€ããŒãã¡ã¢ãªç©ºéãæã¡ãããã»ã¹ã¯ã¡ãã»ãŒãžãéåä¿¡ããããšã§éä¿¡ããŸãã
MPIã®äž»ãªæ©èœïŒ
- 忣ã¡ã¢ãªãã©ãã€ã ïŒããã»ã¹ã¯ãã¡ãã»ãŒãžãéåä¿¡ããããšã§éä¿¡ããŸãã
- æç€ºçãªéä¿¡ïŒããã°ã©ããŒã¯ãããŒã¿ãããã»ã¹éã§ã©ã®ããã«äº€æãããããæç€ºçã«æå®ããå¿ èŠããããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒMPIã¯ãæ°åãŸãã¯æ°çŸäžã®ããã»ããµã«ã¹ã±ãŒãªã³ã°ã§ããŸãã
- ç§»æ€æ§ïŒMPIã¯ãã©ãããããããã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒãŸã§ãå¹ åºããã©ãããã©ãŒã ã§ãµããŒããããŠããŸãã
- è±å¯ãªéä¿¡ããªããã£ãã®ã»ããïŒMPIã¯ããã€ã³ãããŒãã€ã³ãéä¿¡ãã³ã¬ã¯ãã£ãéä¿¡ãããã³äžæ¹éè¡éä¿¡ãªã©ãè±å¯ãªéä¿¡ããªããã£ãã®ã»ãããæäŸããŸãã
MPIéä¿¡ããªããã£ãïŒ
MPIã¯ãããã»ã¹ãããŒã¿ã亀æã§ããããã«ããããŸããŸãªéä¿¡ããªããã£ããæäŸããŸããæãäžè¬çã«äœ¿çšãããããªããã£ãã«ã¯ã次ã®ãããªãã®ããããŸãã
MPI_SendïŒæå®ãããããã»ã¹ã«ã¡ãã»ãŒãžãéä¿¡ããŸããMPI_RecvïŒæå®ãããããã»ã¹ããã¡ãã»ãŒãžãåä¿¡ããŸããMPI_BcastïŒ1ã€ã®ããã»ã¹ããä»ã®ãã¹ãŠã®ããã»ã¹ã«ã¡ãã»ãŒãžããããŒããã£ã¹ãããŸããMPI_ScatterïŒ1ã€ã®ããã»ã¹ããä»ã®ãã¹ãŠã®ããã»ã¹ã«ããŒã¿ã忣ããŸããMPI_GatherïŒãã¹ãŠã®ããã»ã¹ãã1ã€ã®ããã»ã¹ã«ããŒã¿ãåéããŸããMPI_ReduceïŒãã¹ãŠã®ããã»ã¹ããã®ããŒã¿ã«å¯ŸããŠreductionæäœïŒäŸïŒåèšãç©ãæå€§å€ãæå°å€ïŒãå®è¡ããŸããMPI_AllgatherïŒãã¹ãŠã®ããã»ã¹ãããã¹ãŠã®ããã»ã¹ã«ããŒã¿ãåéããŸããMPI_AllreduceïŒãã¹ãŠã®ããã»ã¹ããã®ããŒã¿ã«å¯ŸããŠreductionæäœãå®è¡ããçµæããã¹ãŠã®ããã»ã¹ã«é åžããŸãã
MPIã®äŸïŒé åã®åèšã®èšç®
è€æ°ã®ããã»ã¹éã§é åå ã®èŠçŽ ã®åèšãèšç®ããããã«MPIã䜿çšããç°¡åãªäŸãèããŠã¿ãŸãããã
#include <iostream>
#include <vector>
#include <numeric>
#include <mpi.h>
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int n = 1000000;
std::vector<int> arr(n);
std::iota(arr.begin(), arr.end(), 1); // Fill array with values from 1 to n
// Divide the array into chunks for each process
int chunk_size = n / size;
int start = rank * chunk_size;
int end = (rank == size - 1) ? n : start + chunk_size;
// Calculate the local sum
long long local_sum = 0;
for (int i = start; i < end; ++i) {
local_sum += arr[i];
}
// Reduce the local sums to the global sum
long long global_sum = 0;
MPI_Reduce(&local_sum, &global_sum, 1, MPI_LONG_LONG, MPI_SUM, 0, MPI_COMM_WORLD);
// Print the result on rank 0
if (rank == 0) {
std::cout << "Sum: " << global_sum << std::endl;
}
MPI_Finalize();
return 0;
}
ãã®äŸã§ã¯ãåããã»ã¹ã¯å²ãåœãŠãããé
åã®ãã£ã³ã¯ã®åèšãèšç®ããŸããæ¬¡ã«ãMPI_Reduce颿°ã¯ããã¹ãŠã®ããã»ã¹ããã®ããŒã«ã«åèšãã°ããŒãã«åèšã«çµã¿åãããããã»ã¹0ã«æ ŒçŽããŸãããã®åŸããã®ããã»ã¹ã¯æçµçãªçµæãåºåããŸãã
MPIã®å©ç¹ïŒ
- ã¹ã±ãŒã©ããªãã£ïŒMPIã¯éåžžã«å€æ°ã®ããã»ããµã«ã¹ã±ãŒãªã³ã°ã§ããããã髿§èœã³ã³ãã¥ãŒãã£ã³ã°ã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãã
- ç§»æ€æ§ïŒMPIã¯ãå¹ åºããã©ãããã©ãŒã ã§ãµããŒããããŠããŸãã
- æè»æ§ïŒMPIã¯ãè±å¯ãªéä¿¡ããªããã£ãã®ã»ãããæäŸããããã°ã©ããŒãè€éãªéä¿¡ãã¿ãŒã³ãå®è£ ã§ããããã«ããŸãã
MPIã®æ¬ ç¹ïŒ
- è€éãïŒMPIããã°ã©ãã³ã°ã¯ãããã°ã©ããŒãããã»ã¹éã®éä¿¡ãæç€ºçã«ç®¡çããå¿ èŠããããããOpenMPããã°ã©ãã³ã°ãããè€éã«ãªãå¯èœæ§ããããŸãã
- ãªãŒããŒãããïŒã¡ãã»ãŒãžããã·ã³ã°ã¯ãç¹ã«å°ããªã¡ãã»ãŒãžã®å ŽåããªãŒããŒããããå°å ¥ããå¯èœæ§ããããŸãã
- ãããã°ã®é£ããïŒMPIã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã¯ãããã°ã©ã ã®åæ£ãšããæ§è³ªã®ããã«å°é£ã«ãªãå¯èœæ§ããããŸãã
OpenMPãšMPIïŒé©åãªããŒã«ã®éžæ
OpenMPãšMPIã®éžæã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ãšåºç€ãšãªãããŒããŠã§ã¢ã¢ãŒããã¯ãã£ã«ãã£ãŠç°ãªããŸãã以äžã«ãäž»ãªéããšåãã¯ãããžãŒã䜿çšããå Žåã®ãŸãšãã瀺ããŸãã
| æ©èœ | OpenMP | MPI |
|---|---|---|
| ããã°ã©ãã³ã°ãã©ãã€ã | å ±æã¡ã¢ãª | 忣ã¡ã¢ãª |
| ã¿ãŒã²ããã¢ãŒããã¯ã㣠| ãã«ãã³ã¢ããã»ããµãå ±æã¡ã¢ãªã·ã¹ãã | ã³ã³ãã¥ãŒã¿ãŒã®ã¯ã©ã¹ã¿ãŒã忣ã¡ã¢ãªã·ã¹ãã |
| éä¿¡ | æé»çïŒå ±æã¡ã¢ãªïŒ | æç€ºçïŒã¡ãã»ãŒãžããã·ã³ã°ïŒ |
| ã¹ã±ãŒã©ããªã㣠| å¶éä»ãïŒäžçšåºŠã®æ°ã®ã³ã¢ïŒ | é«ïŒæ°åãŸãã¯æ°çŸäžã®ããã»ããµïŒ |
| è€éã | æ¯èŒç䜿ãããã | ããè€é |
| äžè¬çãªãŠãŒã¹ã±ãŒã¹ | ã«ãŒãã®äžŠååãå°èŠæš¡ãªäžŠåã¢ããªã±ãŒã·ã§ã³ | å€§èŠæš¡ãªç§åŠã·ãã¥ã¬ãŒã·ã§ã³ã髿§èœã³ã³ãã¥ãŒãã£ã³ã° |
OpenMPã䜿çšããå ŽåïŒ
- äžçšåºŠã®æ°ã®ã³ã¢ãæã€å ±æã¡ã¢ãªã·ã¹ãã ã䜿çšããŠããå Žåã
- æ¢åã®ã·ãŒã±ã³ã·ã£ã«ã³ãŒããæ®µéçã«äžŠååãããå Žåã
- ã·ã³ãã«ã§äœ¿ãããã䞊åããã°ã©ãã³ã°APIãå¿ èŠãªå Žåã
MPIã䜿çšããå ŽåïŒ
- ã³ã³ãã¥ãŒã¿ãŒã®ã¯ã©ã¹ã¿ãŒãã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒãªã©ã®åæ£ã¡ã¢ãªã·ã¹ãã ã䜿çšããŠããå Žåã
- ã¢ããªã±ãŒã·ã§ã³ãéåžžã«å€ãã®ããã»ããµã«ã¹ã±ãŒãªã³ã°ããå¿ èŠãããå Žåã
- ããã»ã¹éã®éä¿¡ã现ããå¶åŸ¡ããå¿ èŠãããå Žåã
ãã€ããªããããã°ã©ãã³ã°ïŒOpenMPãšMPIã®çµã¿åãã
å Žåã«ãã£ãŠã¯ããã€ããªããããã°ã©ãã³ã°ã¢ãã«ã§OpenMPãšMPIãçµã¿åããããšå¹æçã§ãããã®ã¢ãããŒãã¯ãäž¡æ¹ã®ãã¯ãããžãŒã®é·æã掻çšããŠãè€éãªã¢ãŒããã¯ãã£ã§æé©ãªããã©ãŒãã³ã¹ãå®çŸã§ããŸããããšãã°ãMPIã䜿çšããŠã¯ã©ã¹ã¿ãŒå ã®è€æ°ã®ããŒãéã§äœæ¥ã忣ããOpenMPã䜿çšããŠåããŒãå ã®èšç®ã䞊ååããããšãã§ããŸãã
ãã€ããªããããã°ã©ãã³ã°ã®å©ç¹ïŒ
- ã¹ã±ãŒã©ããªãã£ã®åäžïŒMPIã¯ããŒãééä¿¡ãåŠçããOpenMPã¯ããŒãå 䞊ååŠçãæé©åããŸãã
- ãªãœãŒã¹å©çšã®åäžïŒãã€ããªããããã°ã©ãã³ã°ã¯ãå ±æã¡ã¢ãªãšåæ£ã¡ã¢ãªã®äžŠååŠçã®äž¡æ¹ã掻çšããããšã«ãããå©çšå¯èœãªãªãœãŒã¹ãããæå¹ã«æŽ»çšã§ããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒOpenMPãšMPIã®é·æãçµã¿åãããããšã§ããã€ããªããããã°ã©ãã³ã°ã¯ãã©ã¡ããã®ãã¯ãããžãŒåç¬ãããåªããããã©ãŒãã³ã¹ãå®çŸã§ããŸãã
䞊åããã°ã©ãã³ã°ã®ãã¹ããã©ã¯ãã£ã¹
OpenMPãŸãã¯MPIã䜿çšããŠãããã©ããã«é¢ä¿ãªããå¹ççã§å¹æçãªäžŠåããã°ã©ã ãèšè¿°ããã®ã«åœ¹ç«ã€äžè¬çãªãã¹ããã©ã¯ãã£ã¹ãããã€ããããŸãã
- åé¡ãçè§£ããïŒã³ãŒãã®äžŠååãéå§ããåã«ã解決ããããšããŠããåé¡ãååã«çè§£ããŠããããšã確èªããŠãã ãããã³ãŒãã®èšç®éçŽçãªéšåãç¹å®ããããããããå°ããç¬ç«ãããµãåé¡ã«åå²ããæ¹æ³ã決å®ããŸãã
- é©åãªã¢ã«ãŽãªãºã ãéžæããïŒã¢ã«ãŽãªãºã ã®éžæã¯ã䞊åããã°ã©ã ã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããæ¬è³ªçã«äžŠååå¯èœã§ãããã䞊åå®è¡ã«å®¹æã«é©å¿ã§ããã¢ã«ãŽãªãºã ã䜿çšããããšãæ€èšããŠãã ããã
- éä¿¡ãæå°éã«æããïŒã¹ã¬ãããŸãã¯ããã»ã¹éã®éä¿¡ã¯ã䞊åããã°ã©ã ã®äž»èŠãªããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã亀æããå¿ èŠãããããŒã¿ã®éãæå°éã«æããå¹ççãªéä¿¡ããªããã£ãã䜿çšããŠãã ããã
- ã¯ãŒã¯ããŒãã®ãã©ã³ã¹ãåãïŒãã¹ãŠã®ã¹ã¬ãããŸãã¯ããã»ã¹éã§ã¯ãŒã¯ããŒããåçã«åæ£ãããŠããããšã確èªããŠãã ãããã¯ãŒã¯ããŒãã®äžåè¡¡ã¯ãã¢ã€ãã«æéã«ã€ãªãããå šäœçãªããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ããããŸãã
- ããŒã¿ã¬ãŒã¹ãåé¿ããïŒããŒã¿ã¬ãŒã¹ã¯ãè€æ°ã®ã¹ã¬ãããŸãã¯ããã»ã¹ãé©åãªåæãªãã«å ±æããŒã¿ã«åæã«ã¢ã¯ã»ã¹ãããšçºçããŸããããŒã¿ã¬ãŒã¹ãé²ããããŒã¿ã®äžè²«æ§ã確ä¿ããããã«ãããã¯ãããªã¢ãªã©ã®åæããªããã£ãã䜿çšããŠãã ããã
- ã³ãŒãã®ãããã¡ã€ã«ãšæé©åïŒãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠã䞊åããã°ã©ã ã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ããŸããéä¿¡ãæžãããã¯ãŒã¯ããŒãã®ãã©ã³ã¹ãåããããŒã¿ã¬ãŒã¹ãåé¿ããããšã§ãã³ãŒããæé©åããŸãã
- 培åºçã«ãã¹ãããïŒäžŠåããã°ã©ã ã培åºçã«ãã¹ãããŠãæ£ããçµæãçæããããå€ãã®ããã»ããµã«ããŸãã¹ã±ãŒãªã³ã°ããããšã確èªããŸãã
䞊åã³ã³ãã¥ãŒãã£ã³ã°ã®çŸå®äžçã®ã¢ããªã±ãŒã·ã§ã³
䞊åã³ã³ãã¥ãŒãã£ã³ã°ã¯ãããŸããŸãªæ¥çãç ç©¶åéã®å¹ åºãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããŸãã以äžã«äŸã瀺ããŸãã
- 倩æ°äºå ±ïŒå°æ¥ã®æ°è±¡æ¡ä»¶ãäºæž¬ããããã«ãè€éãªæ°è±¡ãã¿ãŒã³ãã·ãã¥ã¬ãŒãããŸããïŒäŸïŒè±åœæ°è±¡åºã¯ã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã䜿çšããŠæ°è±¡ã¢ãã«ãå®è¡ããŠããŸããïŒ
- åµè¬ïŒæœåšçãªåè£è¬ãç¹å®ããããã«ãå€§èŠæš¡ãªååã©ã€ãã©ãªãã¹ã¯ãªãŒãã³ã°ããŸããïŒäŸïŒåæ£ã³ã³ãã¥ãŒãã£ã³ã°ãããžã§ã¯ãã§ããFolding@homeã¯ãã¿ã³ãã¯è³ªã®æãç³ã¿ãã·ãã¥ã¬ãŒãããŠãç æ°ãçè§£ããæ°ããæ²»çæ³ãéçºããŠããŸããïŒ
- éèã¢ããªã³ã°ïŒéèåžå Žã®åæãããªããã£ãã®äŸ¡æ Œèšå®ããªã¹ã¯ç®¡çãïŒäŸïŒé«é »åºŠååŒã¢ã«ãŽãªãºã ã¯ãåžå ŽããŒã¿ãåŠçããŠè¿ éã«ååŒãå®è¡ããããã«äžŠåã³ã³ãã¥ãŒãã£ã³ã°ã«äŸåããŠããŸããïŒ
- æ°åå€åç ç©¶ïŒå°çã®æ°åã·ã¹ãã ãã¢ãã«åããŠãäººéæŽ»åãç°å¢ã«äžãã圱é¿ãçè§£ããŸããïŒäŸïŒæ°åã¢ãã«ã¯ãäžçäžã®ã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããå°æ¥ã®æ°åã·ããªãªãäºæž¬ããŠããŸããïŒ
- èªç©ºå®å®å·¥åŠïŒèªç©ºæ©ãšå®å®æ©ã®åšå²ã®ç©ºæ°ã®æµããã·ãã¥ã¬ãŒãããŠãèšèšãæé©åããŸããïŒäŸïŒNASAã¯ãã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã䜿çšããŠãæ°ããèªç©ºæ©ã®èšèšã®ããã©ãŒãã³ã¹ãã·ãã¥ã¬ãŒãããŠããŸããïŒ
- ç³æ²¹ãšã¬ã¹ã®æ¢æ»ïŒå°éããŒã¿ãåŠçããŠãæœåšçãªç³æ²¹ãšã¬ã¹ã®åèµéãç¹å®ããŸããïŒäŸïŒç³æ²¹ããã³ã¬ã¹äŒç€Ÿã¯ã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã䜿çšããŠãå€§èŠæš¡ãªããŒã¿ã»ãããåæããå°è¡šã®è©³çްãªç»åãäœæããŠããŸããïŒ
- æ©æ¢°åŠç¿ïŒå€§èŠæš¡ãªããŒã¿ã»ããã§è€éãªæ©æ¢°åŠç¿ã¢ãã«ããã¬ãŒãã³ã°ããŸããïŒäŸïŒæ·±å±€åŠç¿ã¢ãã«ã¯ã䞊åã³ã³ãã¥ãŒãã£ã³ã°æè¡ã䜿çšããŠGPUïŒã°ã©ãã£ãã¯åŠçãŠãããïŒã§ãã¬ãŒãã³ã°ãããŸããïŒ
- 倩äœç©çåŠïŒéæ²³ããã®ä»ã®å€©äœã®åœ¢æãšé²åãã·ãã¥ã¬ãŒãããŸããïŒäŸïŒå®å®è«çã·ãã¥ã¬ãŒã·ã§ã³ã¯ãã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããå®å®ã®å€§èп𡿧é ãç ç©¶ããŠããŸããïŒ
- ææç§åŠïŒååã¬ãã«ã§ã®ææã®ç¹æ§ãã·ãã¥ã¬ãŒãããŠãç¹å®ã®ç¹æ§ãæã€æ°ããææãèšèšããŸããïŒäŸïŒç ç©¶è ã¯äžŠåã³ã³ãã¥ãŒãã£ã³ã°ã䜿çšããŠãæ¥µç«¯ãªæ¡ä»¶äžã§ã®ææã®åäœãã·ãã¥ã¬ãŒãããŠããŸããïŒ
çµè«
䞊åã³ã³ãã¥ãŒãã£ã³ã°ã¯ãè€éãªåé¡ã解決ããèšç®éçŽåã®ã¿ã¹ã¯ãé«éåããããã®äžå¯æ¬ ãªããŒã«ã§ããOpenMPãšMPIã¯ã䞊åããã°ã©ãã³ã°ã§æãåºã䜿çšãããŠãã2ã€ã®ãã©ãã€ã ã§ãããããããã«ç¬èªã®é·æãšçæããããŸããOpenMPã¯ãå ±æã¡ã¢ãªã·ã¹ãã ã«é©ããŠãããæ¯èŒç䜿ããããããã°ã©ãã³ã°ã¢ãã«ãæäŸããŸãããMPIã¯åæ£ã¡ã¢ãªã·ã¹ãã ã«æé©ã§ãããåªããã¹ã±ãŒã©ããªãã£ãæäŸããŸãã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã®ååãšOpenMPããã³MPIã®æ©èœãçè§£ããããšã«ãããéçºè ã¯ãããã®ãã¯ãããžãŒã掻çšããŠãäžçã§æãå°é£ãªåé¡ã®ããã€ãã«åãçµãããšãã§ãã髿§èœã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããèšç®èœåã«å¯ŸããéèŠãä»åŸãé«ãŸãç¶ããã«ã€ããŠã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã¯ãä»åŸãŸããŸãéèŠã«ãªããŸãããããã®æè¡ãæ¡çšããããšã¯ãããŸããŸãªåéã§é©æ°ã®æåç·ã«çãŸããè€éãªèª²é¡ã解決ããããã«äžå¯æ¬ ã§ãã
è©³çŽ°ãªæ å ±ãšãã¥ãŒããªã¢ã«ã«ã€ããŠã¯ãOpenMPã®å ¬åŒWebãµã€ãïŒhttps://www.openmp.org/ïŒããã³MPIãã©ãŒã©ã Webãµã€ãïŒhttps://www.mpi-forum.org/ïŒãªã©ã®ãªãœãŒã¹ãæ€èšããŠãã ããã