OpenMPÊÂÎó²½(for¥ë¡¼¥×Æâ¤Ëberak¤¬¤¢¤ë¾ì¹ç¡Ë
|
for¥ë¡¼¥×¤ÎÃæ¤Ëbreak¤¬¤¢¤ë¾ì¹çOpenMP¤ÇÊÂÎ󲽤·¤è¤¦¤È¤·¤Æ¤â¥³¥ó¥Ñ¥¤¥ë¥¨¥é¡¼¤È¤Ê¤Ã¤ÆÊÂÎó²½½ÐÍè¤Ê¤¤¡£
#pragma omp parallel¡¡for for ( int i = 0; i < 1000; i++ ) { ......... if ( xxxx ) { break; } ...... } °Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ(Î㤨¤Ð¡ËLoopInBreak¥¯¥é¥¹¤ò»È¤¦¤³¤È¤Çbreak¤¬for¥ë¡¼¥×¤Ë¤¢¤Ã¤Æ¤âÊÂÎó²½½ÐÍè¤ë¡£
int break_flag = false;
#pragma omp parallel {LoopInBreak omp(ÊÂÎ󲽿ô, 1000, &break_flag ); for ( int i = omp.Begin(); omp.Condition(i); i++ ) { ......... if ( xxxx ) { MY_LOOP_BREAK(omp); } ...... } } class Thread_omp_LoopInBreak
{ int threadNum_; //¥¹¥ì¥Ã¥É¿ôÀßÄê int loopNum_; //¥ë¡¼¥×¿ô ( 0...loopNum-1) int threadId; //¥¹¥ì¥Ã¥ÉID //ÊÂÎ󲽤µ¤ì¤Æ¤¤¤ëº£¤Î¥¿¥¹¥¯¤¬¹Ô¤¦¤Ù¤¥ë¡¼¥×½èÍý¤Î³«»Ï¤È½ªÎ»ÃÍ int i_st; int i_ed; int* break_flag_; public: Thread_omp_LoopInBreak( int threadNum, int loopNum, int* break_flag):threadNum_(threadNum),loopNum_(loopNum),break_flag_(break_flag) { #ifdef USE_OPENMP
threadNum_ = threadNum; loopNum_ = loopNum; //ÊÂÎ󲽤µ¤ì¤Æ¤¤¤ë¤È¤¤Îº£¤Î¥¿¥¹¥¯¤Î¥¹¥ì¥Ã¥ÉID
threadId = omp_get_thread_num(); //ÊÂÎ󲽤Îʬ³ä¥¹¥Æ¥Ã¥× int n = (loopNum_ + threadNum_ -1 )/threadNum_; //ÊÂÎ󲽤µ¤ì¤Æ¤¤¤ëº£¤Î¥¿¥¹¥¯¤¬¹Ô¤¦¤Ù¤¥ë¡¼¥×½èÍý¤Î³«»Ï¤È½ªÎ»ÃÍ
i_st = n*threadId; i_ed = ( i_st + n < loopNum_ ) ? i_st + n: loopNum_; #else threadNum_ = 1; loopNum_ = loopNum; threadId = 0; i_st = 0; i_ed = loopNum_; #endif //printf("threadNum(%d) loop %d ¡Á %d\n", threadId, i_st, i_ed ); }
inline int Id() { //ÊÂÎ󲽤µ¤ì¤Æ¤¤¤ë¤È¤¤Îº£¤Î¥¿¥¹¥¯¤Î¥¹¥ì¥Ã¥ÉID return threadId; } inline int Begin()
{ return i_st; } inline int End() { return i_ed; } inline bool Condition(int loopCounter) { return (!(*break_flag_) && loopCounter < i_ed); } inline void LoopBreak() { *break_flag_ = true; } }; #define MY_LOOP_BREAK( omp ) omp.LoopBreak();continue
|
¥³¥á¥ó¥È¡Ê0¡Ë
¥È¥é¥Ã¥¯¥Ð¥Ã¥¯¡Ê0¡Ë
¥È¥é¥Ã¥¯¥Ð¥Ã¥¯¤µ¤ì¤¿µ»ö
¥È¥é¥Ã¥¯¥Ð¥Ã¥¯¤µ¤ì¤Æ¤¤¤ëµ»ö¤¬¤¢¤ê¤Þ¤»¤ó¡£
¥È¥é¥Ã¥¯¥Ð¥Ã¥¯Àè¤Îµ»ö
- ¥È¥é¥Ã¥¯¥Ð¥Ã¥¯Àè¤Îµ»ö¤¬¤¢¤ê¤Þ¤»¤ó¡£
¤³¤Îµ»ö¤ÎURL: http://blogs.yahoo.co.jp/cat_falcon/33220658.html




