ã¯ããã«
ããã®é£è¼ã¯ãOpenMPãéãã¦ä¸¦åå¦çã®èãæ¹ããä¼ããããã¨ãç®çã¨ãã¦ãã¾ãããã«ãã³ã¢CPUãæ¢ã«æ®åãã¦ãã¾ãã®ã§ãä»å¾ã¯ä¸¦åããã°ã©ãã³ã°ãä¸è¬çãªãã®ã¨ãªãããã¾ãã¾ãªæè¡ãç»å ´ããã§ãããããã®æ並åããã°ã©ãã³ã°ã®æ ¹åºã«æµããèãæ¹ã身ã«ä»ãããã¦ããã°ãæ¯è¼ç容æã«æ°æè¡ãç¿å¾ãããã¨ãã§ããã§ãããã
ãä»åã¯ä¸¦åããã°ã©ãã³ã°ã«å½¹ç«ã¤å®è¡æã©ã¤ãã©ãªã®é¢æ°ã¨ä¸¦åã«ã¼ãã«ã¤ãã¦è§£èª¬ãã¾ãããã®é£è¼ã§è§£èª¬ã«ä½¿ç¨ãããµã³ãã«ã³ã¼ãã¯ããã¾ã§ãOpenMPã®åºç¤ãç解ããããã®ãã®ã§ãããå®åã§OpenMPã使ç¨ããéã«ã¯ããç解ãã¦ããç¨éã«é©ããããã°ã©ãã³ã°ãè¡ã£ã¦ãã ããã
対象èªè
ãçè ãæ³å®ãã¦ããèªè ã¯Cã®åºæ¬çææ³ããã¹ã¿ã¼ãã並ååããã°ã©ãã³ã°ã«èå³ãæã£ã¦ããæ¹ã§ããåã£ããã¯ããã¯ã極åãããåºæ¬çãªææ³ããåããã°èªããããã«æ³¨æãã¾ãã®ã§ã並ååã«èå³ãæã£ã¦ããæ¹ã¯ãã²ãã®é£è¼ã«ç®ãéãã¦ãã ããã
å¿ è¦ãªç°å¢
ãå¿ è¦ãªç°å¢ã«ã¤ãã¦ã¯ã第1åãåç §ãã¦ãã ããã
ããªãããã®é£è¼ã¯åºæ¬çã«Windowsç°å¢ãæ³å®ãã¦è§£èª¬ãã¾ãããOpenMPãã®ãã®ã¯ä»ã®OSä¸ã§ãåä½ãã¾ãã®ã§ãé©å®èªã¿æ¿ãã¦åèã«ãã¦ãã ããã
å®è¡æã©ã¤ãã©ãªã®æ¦è¦
ãOpenMPã§ã¯ãã³ã³ãã¤ã©ãå®è£ ããªããã°ãªããªãAPIï¼ã¢ããªã±ã¼ã·ã§ã³ããã°ã©ã ã¤ã³ã¿ãã§ã¼ã¹ï¼ãå®è¡æã©ã¤ãã©ãªã¨ãã¦å®ç¾©ãã¦ãã¾ããå¾ã£ã¦ãOpenMPããµãã¼ãããã³ã³ãã¤ã©ã§ããã°ãå ±éãã¦ã©ã¤ãã©ãªã使ç¨ãããã¨ãã§ãã移æ¤æ§ãé«ãã½ããã¦ã§ã¢ãå®è£ ããæå©ãã¨ãªãã¾ããããã¦ãå®è¡æã©ã¤ãã©ãªã¯ä¸¦åããã°ã©ãã³ã°ãæ¯æ´ããããã®ä¾¿å©ãªé¢æ°ãå®ç¾©ãã¦ãã¾ãã
ããã®é£è¼ã§ã¯ä»å¾ãOpenMPã§ã®ä¸¦åããã°ã©ãã³ã°ã解説ããããã«ã並åå¦çã«é¢é£ããæ å ±ã使ç¨ãã¾ãããã®æ å ±ã¯å®è¡æã©ã¤ãã©ãªã使ç¨ãããã¨ã«ããåå¾ã§ãã¾ãã®ã§ã次é ãããã使ç¨ããå®è¡æã©ã¤ãã©ãªã®é¢æ°ã«ã¤ãã¦è§£èª¬ãã¦ããã¾ãã
ã並åããã°ã©ãã³ã°ã«é¢ããé¢æ°ã¨èãã°é£ããæããããããã¾ããããå®è¡æã©ã¤ãã©ãªã®ä½¿ãæ¹ã¯å®éã«ããã°ã©ã ãåä½ãããã¨æ¯è¼çç°¡åã«ç解ã§ãã¾ãã®ã§å®å¿ãã¦èªã¿é²ãã¦ãã ããã
ã¹ã¬ããã«é¢ããé¢æ°
ãä¸çªæåã¯ãã¹ã¬ããã«é¢ããæ å ±ãåå¾ããå®è¡æã©ã¤ãã©ãªã®é¢æ°ã解説ãã¾ãã並åããã°ã©ãã³ã°ãããéã«ã¯ãã¹ã¬ããã«é¢ããæ å ±ãåå¾ã§ããã°è²ã 便å©ã§ããä¾ãã°ãé次ããã°ã©ãã³ã°ã§ã¯æ£å¸¸ã«åä½ãã¦ããããã°ã©ã ããOpenMPãé©ç¨ããé端ã«äºæããªãå¦ççµæãè¿ãããã«ãªã£ãæãã©ã®ã¹ã¬ãããå¦çããã¦ããã®ãããåä½ãã¦ããã¹ã¬ããã®æ°ã確èªã§ããã°ãããã°ã«å½¹ç«ã¡ã¾ãã
ãã¾ãã¯è¨äºã«æ·»ä»ããã¦ãããµã³ãã«ã³ã¼ãã®ãã¡ãget_num_threadsããã¸ã§ã¯ããè¦ã¦ãã ããã
#include <stdio.h> #include <omp.h> int main() { /* é次å¦çã®ã¹ã¬ããã«é¢ããæ å ±ã表示 */ printf("ç¾å¨ä½¿ç¨ä¸ã®ã¹ã¬ããæ°ã¯ã%dãã§ãã\n", omp_get_num_threads() ); printf("使ç¨å¯è½ãªã¹ã¬ããæ°ã¯æ大ã%dãã§ãã\n", omp_get_max_threads() ); /* 並åå¦çãæå®ããæã®ã¹ã¬ããã«é¢ããæ å ±ã表示 */ #pragma omp parallel { #pragma omp single { printf("ç¾å¨ä½¿ç¨ä¸ã®ã¹ã¬ããæ°ã¯ã%dãã§ãã\n", omp_get_num_threads() ); printf("使ç¨å¯è½ãªã¹ã¬ããæ°ã¯æ大ã%dãã§ãã\n", omp_get_max_threads() ); } } /* ã¹ã¬ããæ°ã¨ä¸¦åå¦çãæå®ããæã®ã¹ã¬ããã«é¢ããæ å ±ã表示 */ #pragma omp parallel num_threads(10) { #pragma omp single { printf("ç¾å¨ä½¿ç¨ä¸ã®ã¹ã¬ããæ°ã¯ã%dãã§ãã\n", omp_get_num_threads() ); printf("使ç¨å¯è½ãªã¹ã¬ããæ°ã¯æ大ã%dãã§ãã\n", omp_get_max_threads() ); } } printf( "\n" ); return 0; }

ããã®ãµã³ãã«ããã¸ã§ã¯ãã¯ãomp_get_num_threadsé¢æ°ã¨omp_get_max_threadsé¢æ°ã®ä½¿ç¨æ³ã示ããã®ã§ããé次å¦çããã¦ããï¼parallelã®æå®ããã¦ããªãï¼é¨åã¯ã1ã¤ã®ã¹ã¬ãããã使ç¨ããªãã®ã§omp_get_num_threadsé¢æ°ã¯å¿ ã1ãè¿ãã¾ããä¸æ¹ã並åå¦çãããå ´åã¯ãCPUã®è«çã³ã¢æ°ã¨åãããparallelæ§æãªã©ã§æå®ããæ°ã¨åãã ãã®æ°ãè¿ããã¾ããããã¦ãomp_get_max_threadsé¢æ°ã¯ãå¿ ãnthreads-varå é¨å¶å¾¡å¤æ°ã®å¤ãè¿ããã¾ããnum_threadsæ示å¥ã«æå®ãããæ°ã¯èæ ®ããã¾ãããå®éã«å®è¡ãã¦ç¢ºèªãã¦ã¿ã¦ãã ããã
ãæ示å¥ã¨ããã®ã¯OpenMPã®ç¨èªã§ãä¾ãã°#pragma omp parallel num_threads(10)ã®å ´å#pragma omp parallelã®é¨åãæ示æã¨ãã³ãå¾ç¶ã®num_threadsã®é¨åãæ示å¥ã¨å¼ã³ã¾ãã
ããªãããã®ãµã³ãã«ã³ã¼ãã§#pragma omp singleãæå®ãã¦ããçç±ã¯ãåãã¡ãã»ã¼ã¸ãä½åº¦ã表示ããªãããã§ããsingleæ示æããªãã¨ä½åº¦ãåãã¡ãã»ã¼ã¸ã表示ããããã¨ã«ãªãã¾ããsingleæ示æãã³ã¡ã³ãã¢ã¦ããããªã©ãã¦ãä¸åº¦è©¦ãã¦ã¿ã¦ãã ããã
ã以ä¸ã§ã¹ã¬ããæ°ã«é¢ããæ å ±ãåå¾ãããã¨ãã§ãã¾ããããåã ã®ã¹ã¬ãããèå¥ã§ããã°å¤§å¤ä¾¿å©ã§ãã幸ãOpenMPã®ã¹ã¬ããã«ã¯çªå·ãä»ãããããã®çªå·ãåå¾ããé¢æ°omp_get_thread_numãå®è¡æã©ã¤ãã©ãªã«ç¨æããã¦ãã¾ãã
ããµã³ãã«ããã¸ã§ã¯ãomp_get_thread_numãç¨ãã¦ä½¿ç¨æ³ã解説ãã¾ãã
#include <stdio.h> #include <omp.h> int main() { #pragma omp parallel printf("Hello, World (ã¹ã¬ããçªå·%dï¼\n", omp_get_thread_num() ); printf( "\n" ); return 0; }

ããã®ãµã³ãã«ããã¸ã§ã¯ãomp_get_thread_numãå®è¡ããã¨ãè¤æ°ã®ã¹ã¬ãããåãã¦ãããã¨ã¨ããã®ã¹ã¬ããã®çªå·ã確èªã§ãã¾ãã