Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/mty-makai/mty.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 254 by notanpe, Tue Dec 28 12:23:53 2010 UTC revision 256 by notanpe, Wed Dec 29 15:20:36 2010 UTC
# Line 49  Line 49 
49  #define THREAD_MAX 32  #define THREAD_MAX 32
50  int     availCPU;       /* usage() で使うので大域変数 */  int     availCPU;       /* usage() で使うので大域変数 */
51    
52    #define STS_SPAN 5000   /* 速度表示の間隔 (ミリ秒) */
53    
54    /* がんばりぐあい */
55    #define GEAR_MAX 10
56    #define GEAR_MIN  1
57    #define GEAR_DEF 10
58    #define GEAR_SLEEP 10
59    #define YOUSUMI 6       /* STS_PAN * YOUSUMI 秒様子見 */
60    int     lCntMax;
61    
62  static HANDLE mutex_key;  static HANDLE mutex_key;
63    
64  /* CRYPT64 記述子 */  /* CRYPT64 記述子 */
# Line 392  thread_crypt64_new(void *a_param) Line 402  thread_crypt64_new(void *a_param)
402          struct PACKET_CRYPT64 *pkt = packet_create(16, 1024, key.key);          struct PACKET_CRYPT64 *pkt = packet_create(16, 1024, key.key);
403          uint64_t *ploop;          uint64_t *ploop;
404          THREAD_TH_T th = thread_get_tid();          THREAD_TH_T th = thread_get_tid();
405            int     lc;
406    
407          WaitForSingleObject(mutex_key, INFINITE);          WaitForSingleObject(mutex_key, INFINITE);
408    
409            OLDPRINT( "n_cpus %d\n", n_cpus );
410          ploop = &loop_cpu[n_cpus++];          ploop = &loop_cpu[n_cpus++];
411    
412          srand(usec() ^ param->seed ^ (unsigned)th);          srand(usec() ^ param->seed ^ (unsigned)th);
# Line 405  thread_crypt64_new(void *a_param) Line 417  thread_crypt64_new(void *a_param)
417          thread_set_priority(th, param->pri);          thread_set_priority(th, param->pri);
418  #endif  #endif
419    
420            lc = 0;
421          for (;;)          for (;;)
422          {          {
423                  do                  do
# Line 422  thread_crypt64_new(void *a_param) Line 435  thread_crypt64_new(void *a_param)
435                                             pkt->param64.hit,                                             pkt->param64.hit,
436                                             pkt->param64.lr);                                             pkt->param64.lr);
437                          check_hit(pkt, pkt->param64.hit);                          check_hit(pkt, pkt->param64.hit);
438                          *ploop += N_ALU * ALU_BITS;                          (*ploop)++;
439    #ifdef ENABLE_GEAR
440                            lc++;
441                            if ( lCntMax != 0 ) {
442                             if ( lc > lCntMax ) {
443                              OLDPRINT( "before %I64u\n", usec() );
444                              Sleep( (DWORD)GEAR_SLEEP );
445                              OLDPRINT( "after %I64u\n", usec() );
446                              lc = 0;
447                             }
448                            }
449    #endif /* ENABLE_GEAR */
450                  }                  }
451                  while (key_inc(&key, 6, 8) || key_inc(&key, KEY_SHUFFLE_POS, 8));                  while (key_inc(&key, 6, 8) || key_inc(&key, KEY_SHUFFLE_POS, 8));
452                  DPRINT( "saaaaalt chaaaaange\n" );                  OLDPRINT( "saaaaalt chaaaaange\n" );
453    
454                  WaitForSingleObject(mutex_key, INFINITE);                  WaitForSingleObject(mutex_key, INFINITE);
455                  key_reset(&key, 0);                  key_reset(&key, 0);
# Line 467  char   *path; Line 491  char   *path;
491    
492    myName = bname( path );    myName = bname( path );
493    printf( "まあ、待て屋。魔改造版 (%s)\n", KIND );    printf( "まあ、待て屋。魔改造版 (%s)\n", KIND );
494    printf( "%s [-h] [-v] [-p num] [-t num|-m mask]\n", myName );    printf( "%s [-h] [-v] [-p num] [-t num|-m mask] [-g num]\n", myName );
495    printf( " -h : これを表示\n" );    printf( " -h : これを表示\n" );
496    printf( " -v : 冗長メッセージ\n" );    printf( " -v : 冗長メッセージ\n" );
497    printf( " -p num : 優先度の設定 ( %d ≦ num ≦ %d, デフォルトは %d )\n",    printf( " -p num : 優先度の設定 ( %d ≦ num ≦ %d, デフォルトは %d )\n",
# Line 481  char   *path; Line 505  char   *path;
505            THREAD_MIN, availCPU, availCPU );            THREAD_MIN, availCPU, availCPU );
506    printf( " -m mask : 実行する CPU を指定するマスク ( 1 ビット ≦ mask のビット数 ≦ %d ビット )\n",    printf( " -m mask : 実行する CPU を指定するマスク ( 1 ビット ≦ mask のビット数 ≦ %d ビット )\n",
507            THREAD_MAX );            THREAD_MAX );
508      printf( " -g num : がんばりぐあい ( %d (やる気なし) ≦ num ≦ %d (フルパワー), デフォルトは、%d )\n", GEAR_MIN, GEAR_MAX, GEAR_DEF );
509  }  }
510    
511  /***************************************************************  /***************************************************************
# Line 493  int Line 518  int
518  main(int argc, char *argv[])  main(int argc, char *argv[])
519  {  {
520    int i;    int i;
   int mincnt;  
521    CODE_T *code = NULL;    CODE_T *code = NULL;
522    long code_cmp;    long code_cmp;
523    FILE *sfp;    /* scoreboard */    FILE *sfp;    /* scoreboard */
524    struct ITREE *root_expr;    struct ITREE *root_expr;
525    uint64_t proc_mask;    uint64_t proc_mask;
526      int   nThread;
527    struct THREAD_PARAM *threads = NULL;    struct THREAD_PARAM *threads = NULL;
528    int nthreads;    int nthreads;
529    int tn;    int tn;
530    int cr;    int   aveSpeed, spanSpeed, bestSpeed;
531      int   gear;
532      int   sCnt;
533      int   tmplCntMax;
534      int   maxSrchCnt;
535    
536    /* 鍵文字列 */    /* 鍵文字列 */
537    struct KS_KEY key;    struct KS_KEY key;
# Line 515  main(int argc, char *argv[]) Line 544  main(int argc, char *argv[])
544      uint64_t lastloop;  /* 最後に表示した時の loop */      uint64_t lastloop;  /* 最後に表示した時の loop */
545    } status;    } status;
546    uint64_t curTime;    uint64_t curTime;
   uint32_t upd_int = 0;  
 /*  
  平均速度 (trips/s) * UPDATE_INTERVAL が UINT32_MAX を超えると発狂する。  
  UINT32_MAX = 4294967295, 平均速度 = 100Mtrips/s なら、  
  4294967295 / (100 * 1000 * 1000) = 42.949 秒まで。(和良  
  LOOP_FACTOR が平均速度より十分小さければ、ほぼ指定間隔になる。  
  LOOP_FACTOR * UINT32_MAX + LOOP_FACOTR 個検索するとオーバーフローする。w  
  */  
547    
548    if (!cpuid_issupported())    if (!cpuid_issupported())
549          {          {
# Line 536  main(int argc, char *argv[]) Line 557  main(int argc, char *argv[])
557    extern int    optind;    extern int    optind;
558    char  *chPtr;    char  *chPtr;
559    uint64_t      availMask;    uint64_t      availMask;
   int   nThread;  
560    uint64_t      pmask;    uint64_t      pmask;
561    DWORD priority;    DWORD priority;
562    int   verbose;    int   verbose;
# Line 548  main(int argc, char *argv[]) Line 568  main(int argc, char *argv[])
568    nThread = 0;    nThread = 0;
569    pmask = 0;    pmask = 0;
570    verbose = 0;    verbose = 0;
571      gear = GEAR_DEF;
572    
573    /* abcdefg ijkl no qrs u wxyz 未使用 */    /* abcdef  ijkl no qrs u wxyz 未使用 */
574    /*        h    m  p   t v     使用済み */    /*       gh    m  p   t v     使用済み */
575    while ( (optChar = getopt(argc, argv, "hm:p:t:v")) != EOF ) {    while ( (optChar = getopt(argc, argv, "g:hm:p:t:v")) != EOF ) {
576     switch ( optChar ) {     switch ( optChar ) {
577        case 'g':
578    #ifdef ENABLE_GEAR
579         gear = atoi( optarg );
580         if ( gear < GEAR_MIN || gear > GEAR_MAX ) {
581          usage( argv[0] );
582          exit( 1 );
583         }
584    #else /* ENABLE_GEAR */
585             printf( "-g オプションは無効化されています\n" );
586    #endif /* ENABLE_GEAR */
587         break;
588      case 'h':      case 'h':
589       usage( argv[0] );       usage( argv[0] );
590       exit( 0 );       exit( 0 );
# Line 630  main(int argc, char *argv[]) Line 662  main(int argc, char *argv[])
662     }     }
663    }    }
664    
665    printf( "%d 個の検索スレッドを起動\n", popcnt64( proc_mask ) );    nThread = popcnt64( proc_mask );
666      printf( "%d 個の検索スレッドを起動\n", nThread );
667    if ( verbose ) {    if ( verbose ) {
668     int  i;     int  i;
669     printf( "優先度を" );     printf( "優先度を" );
# Line 647  main(int argc, char *argv[]) Line 680  main(int argc, char *argv[])
680      }      }
681     }     }
682     printf( "を使用\n" );     printf( "を使用\n" );
683       if ( gear == GEAR_MAX ) {
684        printf( "CPU を 100%% 使用\n" );
685       } else {
686        printf( "CPU を %d 割ぐらい使用\n", gear );
687       }
688    }    }
689    
690  #ifdef WIN32  #ifdef WIN32
# Line 758  main(int argc, char *argv[]) Line 796  main(int argc, char *argv[])
796                                  thread_set_affinity(h, i);                                  thread_set_affinity(h, i);
797  #endif  #endif
798                                  nthreads++;                                  nthreads++;
799  #if 1  #if 0
800                                  /* IDLE */                                  /* IDLE */
801                                  threads[nthreads].code = code;                                  threads[nthreads].code = code;
802                                  threads[nthreads].code_cmp = code_cmp;                                  threads[nthreads].code_cmp = code_cmp;
# Line 783  main(int argc, char *argv[]) Line 821  main(int argc, char *argv[])
821    fprintf(stderr, "検索開始!\n");    fprintf(stderr, "検索開始!\n");
822    ReleaseMutex(mutex_key);    ReleaseMutex(mutex_key);
823    
   mincnt = 0x7FFFFFFF;  
   
   cr = 0;  
824    memset( &status, 0, sizeof( struct status ) );    memset( &status, 0, sizeof( struct status ) );
825    status.startTime = status.lastTime = usec();    status.startTime = status.lastTime = usec();
826    
827    /* 探索ループだぞっと */    bestSpeed = 0;
828    for (;;)    sCnt = 0;
829          {    lCntMax = 0;
830            Sleep(5000);    maxSrchCnt = 0;
831      for ( ;; ) {
832            /* 速度計測 */            uint64_t diffTime;
833          uint64_t spanLoop;
834    
835              Sleep(STS_SPAN);
836    
837              #ifdef OLDEBUG
838              putchar( '\n' );
839              #endif /* DEBUG */
840            status.loop = 0;            status.loop = 0;
841            for (i = 0; i < n_cpus; i++) status.loop += loop_cpu[i];            for (i = 0; i < n_cpus; i++) {
842               OLDPRINT( "loop_cpu[%d] %d\n", i, loop_cpu[i] );
843            if (status.loop >= status.lastloop + upd_int             status.loop += loop_cpu[i];
844                    && (curTime = usec()) != status.lastTime)            }
845                  {            status.loop *= N_ALU * ALU_BITS;
846                    uint64_t diffTime;  
847                    int a, b, c;            spanLoop = status.loop - status.lastloop;
848                    /* 通算(単位 ktrips/sec) */            if ( spanLoop > maxSrchCnt ) {
849                    diffTime = curTime - status.startTime;             maxSrchCnt = spanLoop;
850                    a = status.loop / ((1000 / USEC_SEC) * diffTime);            }
851    
852                    /* 区間(単位 trips/sec) */            curTime = usec();
853                    diffTime = curTime - status.lastTime;  
854                    b = USEC_SEC * (status.loop - status.lastloop) / diffTime;            /* 通算 (単位 trips/usec = ktrips/sec) */
855              diffTime = curTime - status.startTime;
856                    /* 予測 */            aveSpeed = status.loop / diffTime;
857                    c = UPDATE_INTERVAL * b;  
858              /* 区間 (単位 trips/usec = ktrips/sec) */
859                    /* 立ち上がりなど、誤差があり upd_int が小さすぎたときは            diffTime = curTime - status.lastTime;
860                           いきなり全補正せず 1 秒(==b)づつ収斂させる。 */            spanSpeed = spanLoop / diffTime;
861                    upd_int = (upd_int + b < c  
862                                           ? upd_int + b            /* 最速 */
863                                           : c);            if ( spanSpeed > bestSpeed ) {
864               bestSpeed = spanSpeed;
865                    status.lastTime = curTime;             if ( gear != GEAR_MAX ) {
866                    status.lastloop = status.loop;          tmplCntMax = ((maxSrchCnt / (N_ALU * ALU_BITS)) * gear / 10) / ((STS_SPAN - (STS_SPAN * gear / 10)) / GEAR_SLEEP) / nThread;
867  #if DEBUG>=1             }
868                    fprintf(stderr,            }
869                            "%5d/%5d(%3d%%)",  
870                            nblk_hit, nblk_total, 100 * nblk_hit / nblk_total);            if ( gear != GEAR_MAX ) {
871                    nblk_hit = nblk_total = 0;             if ( sCnt == YOUSUMI && lCntMax == 0 ) {
872                    if (nap_total)              if ( tmplCntMax < 1 ) {
873                          fprintf(stderr,               lCntMax = 1;
874                                  "  %5d/%5d(%3d%%)",              } else {
875                                  nap_hit, nap_total, 100 * nap_hit / nap_total);               lCntMax = tmplCntMax;
876                    else              }
877                          fprintf(stderr,              OLDPRINT( "lCntMax = %d\n", lCntMax );
878                                          "  -----/-----(---%%)");              printf( "\nCPU 使用率制限モード開始\n" );
879                    nap_hit = nap_total = 0;             }
880  #endif            }
881                    fprintf(stderr,            sCnt++;
882                                    "%4d.%03dMtrips/s [%4d.%06dMtrips/s]\r",  
883                                    a / 1000, a % 1000,            status.lastTime = curTime;
884                                    b / 1000000, b % 1000000);            status.lastloop = status.loop;
885                    cr++;  
886                  }            fprintf(stderr,
887                              "通算 %dktrips/s [区間 %dktrips/s] {最速 %dktrips/s}\r",
888                              aveSpeed, spanSpeed, bestSpeed );
889          }          }
890    
891    return 0;    return 0;

Legend:
Removed from v.254  
changed lines
  Added in v.256

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26