• R/O
  • SSH
  • HTTPS

naniya: Commit


Commit MetaInfo

Revision256 (tree)
Zeit2010-12-30 00:20:36
Autornotanpe

Log Message

速度表示関連をいろいろ変更。
-g オプションを実装。
IDLE スレッドを起動しないようにした。(そもそも逆効果な気がするし)

Ändern Zusammenfassung

Diff

--- branches/mty-makai/mty.c (revision 255)
+++ branches/mty-makai/mty.c (revision 256)
@@ -49,6 +49,16 @@
4949 #define THREAD_MAX 32
5050 int availCPU; /* usage() で使うので大域変数 */
5151
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+
5262 static HANDLE mutex_key;
5363
5464 /* CRYPT64 記述子 */
@@ -392,9 +402,11 @@
392402 struct PACKET_CRYPT64 *pkt = packet_create(16, 1024, key.key);
393403 uint64_t *ploop;
394404 THREAD_TH_T th = thread_get_tid();
405+ int lc;
395406
396407 WaitForSingleObject(mutex_key, INFINITE);
397408
409+ OLDPRINT( "n_cpus %d\n", n_cpus );
398410 ploop = &loop_cpu[n_cpus++];
399411
400412 srand(usec() ^ param->seed ^ (unsigned)th);
@@ -405,6 +417,7 @@
405417 thread_set_priority(th, param->pri);
406418 #endif
407419
420+ lc = 0;
408421 for (;;)
409422 {
410423 do
@@ -422,10 +435,21 @@
422435 pkt->param64.hit,
423436 pkt->param64.lr);
424437 check_hit(pkt, pkt->param64.hit);
425- *ploop += N_ALU * ALU_BITS;
438+ (*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 */
426450 }
427451 while (key_inc(&key, 6, 8) || key_inc(&key, KEY_SHUFFLE_POS, 8));
428- DPRINT( "saaaaalt chaaaaange\n" );
452+ OLDPRINT( "saaaaalt chaaaaange\n" );
429453
430454 WaitForSingleObject(mutex_key, INFINITE);
431455 key_reset(&key, 0);
@@ -467,7 +491,7 @@
467491
468492 myName = bname( path );
469493 printf( "まあ、待て屋。魔改造版 (%s)\n", KIND );
470- printf( "%s [-h] [-v] [-p num] [-t num|-m mask]\n", myName );
494+ printf( "%s [-h] [-v] [-p num] [-t num|-m mask] [-g num]\n", myName );
471495 printf( " -h : これを表示\n" );
472496 printf( " -v : 冗長メッセージ\n" );
473497 printf( " -p num : 優先度の設定 ( %d ≦ num ≦ %d, デフォルトは %d )\n",
@@ -481,6 +505,7 @@
481505 THREAD_MIN, availCPU, availCPU );
482506 printf( " -m mask : 実行する CPU を指定するマスク ( 1 ビット ≦ mask のビット数 ≦ %d ビット )\n",
483507 THREAD_MAX );
508+ printf( " -g num : がんばりぐあい ( %d (やる気なし) ≦ num ≦ %d (フルパワー), デフォルトは、%d )\n", GEAR_MIN, GEAR_MAX, GEAR_DEF );
484509 }
485510
486511 /***************************************************************
@@ -493,16 +518,20 @@
493518 main(int argc, char *argv[])
494519 {
495520 int i;
496- int mincnt;
497521 CODE_T *code = NULL;
498522 long code_cmp;
499523 FILE *sfp; /* scoreboard */
500524 struct ITREE *root_expr;
501525 uint64_t proc_mask;
526+ int nThread;
502527 struct THREAD_PARAM *threads = NULL;
503528 int nthreads;
504529 int tn;
505- int cr;
530+ int aveSpeed, spanSpeed, bestSpeed;
531+ int gear;
532+ int sCnt;
533+ int tmplCntMax;
534+ int maxSrchCnt;
506535
507536 /* 鍵文字列 */
508537 struct KS_KEY key;
@@ -515,14 +544,6 @@
515544 uint64_t lastloop; /* 最後に表示した時の loop */
516545 } status;
517546 uint64_t curTime;
518- uint32_t upd_int = 0;
519-/*
520- 平均速度 (trips/s) * UPDATE_INTERVAL が UINT32_MAX を超えると発狂する。
521- UINT32_MAX = 4294967295, 平均速度 = 100Mtrips/s なら、
522- 4294967295 / (100 * 1000 * 1000) = 42.949 秒まで。(和良
523- LOOP_FACTOR が平均速度より十分小さければ、ほぼ指定間隔になる。
524- LOOP_FACTOR * UINT32_MAX + LOOP_FACOTR 個検索するとオーバーフローする。w
525- */
526547
527548 if (!cpuid_issupported())
528549 {
@@ -536,7 +557,6 @@
536557 extern int optind;
537558 char *chPtr;
538559 uint64_t availMask;
539- int nThread;
540560 uint64_t pmask;
541561 DWORD priority;
542562 int verbose;
@@ -548,11 +568,23 @@
548568 nThread = 0;
549569 pmask = 0;
550570 verbose = 0;
571+ gear = GEAR_DEF;
551572
552- /* abcdefg ijkl no qrs u wxyz 未使用 */
553- /* h m p t v 使用済み */
554- while ( (optChar = getopt(argc, argv, "hm:p:t:v")) != EOF ) {
573+ /* abcdef ijkl no qrs u wxyz 未使用 */
574+ /* gh m p t v 使用済み */
575+ while ( (optChar = getopt(argc, argv, "g:hm:p:t:v")) != EOF ) {
555576 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;
556588 case 'h':
557589 usage( argv[0] );
558590 exit( 0 );
@@ -630,7 +662,8 @@
630662 }
631663 }
632664
633- printf( "%d 個の検索スレッドを起動\n", popcnt64( proc_mask ) );
665+ nThread = popcnt64( proc_mask );
666+ printf( "%d 個の検索スレッドを起動\n", nThread );
634667 if ( verbose ) {
635668 int i;
636669 printf( "優先度を" );
@@ -647,6 +680,11 @@
647680 }
648681 }
649682 printf( "を使用\n" );
683+ if ( gear == GEAR_MAX ) {
684+ printf( "CPU を 100%% 使用\n" );
685+ } else {
686+ printf( "CPU を %d 割ぐらい使用\n", gear );
687+ }
650688 }
651689
652690 #ifdef WIN32
@@ -758,7 +796,7 @@
758796 thread_set_affinity(h, i);
759797 #endif
760798 nthreads++;
761-#if 1
799+#if 0
762800 /* IDLE */
763801 threads[nthreads].code = code;
764802 threads[nthreads].code_cmp = code_cmp;
@@ -783,65 +821,71 @@
783821 fprintf(stderr, "検索開始!\n");
784822 ReleaseMutex(mutex_key);
785823
786- mincnt = 0x7FFFFFFF;
787-
788- cr = 0;
789824 memset( &status, 0, sizeof( struct status ) );
790825 status.startTime = status.lastTime = usec();
791826
792- /* 探索ループだぞっと */
793- for (;;)
794- {
795- Sleep(5000);
827+ bestSpeed = 0;
828+ sCnt = 0;
829+ lCntMax = 0;
830+ maxSrchCnt = 0;
831+ for ( ;; ) {
832+ uint64_t diffTime;
833+ uint64_t spanLoop;
796834
797- /* 速度計測 */
835+ Sleep(STS_SPAN);
836+
837+ #ifdef OLDEBUG
838+ putchar( '\n' );
839+ #endif /* DEBUG */
798840 status.loop = 0;
799- for (i = 0; i < n_cpus; i++) status.loop += loop_cpu[i];
841+ for (i = 0; i < n_cpus; i++) {
842+ OLDPRINT( "loop_cpu[%d] %d\n", i, loop_cpu[i] );
843+ status.loop += loop_cpu[i];
844+ }
845+ status.loop *= N_ALU * ALU_BITS;
800846
801- if (status.loop >= status.lastloop + upd_int
802- && (curTime = usec()) != status.lastTime)
803- {
804- uint64_t diffTime;
805- int a, b, c;
806- /* 通算(単位 ktrips/sec) */
807- diffTime = curTime - status.startTime;
808- a = status.loop / ((1000 / USEC_SEC) * diffTime);
847+ spanLoop = status.loop - status.lastloop;
848+ if ( spanLoop > maxSrchCnt ) {
849+ maxSrchCnt = spanLoop;
850+ }
809851
810- /* 区間(単位 trips/sec) */
811- diffTime = curTime - status.lastTime;
812- b = USEC_SEC * (status.loop - status.lastloop) / diffTime;
852+ curTime = usec();
813853
814- /* 予測 */
815- c = UPDATE_INTERVAL * b;
854+ /* 通算 (単位 trips/usec = ktrips/sec) */
855+ diffTime = curTime - status.startTime;
856+ aveSpeed = status.loop / diffTime;
816857
817- /* 立ち上がりなど、誤差があり upd_int が小さすぎたときは
818- いきなり全補正せず 1 秒(==b)づつ収斂させる。 */
819- upd_int = (upd_int + b < c
820- ? upd_int + b
821- : c);
858+ /* 区間 (単位 trips/usec = ktrips/sec) */
859+ diffTime = curTime - status.lastTime;
860+ spanSpeed = spanLoop / diffTime;
822861
823- status.lastTime = curTime;
824- status.lastloop = status.loop;
825-#if DEBUG>=1
826- fprintf(stderr,
827- "%5d/%5d(%3d%%)",
828- nblk_hit, nblk_total, 100 * nblk_hit / nblk_total);
829- nblk_hit = nblk_total = 0;
830- if (nap_total)
831- fprintf(stderr,
832- " %5d/%5d(%3d%%)",
833- nap_hit, nap_total, 100 * nap_hit / nap_total);
834- else
835- fprintf(stderr,
836- " -----/-----(---%%)");
837- nap_hit = nap_total = 0;
838-#endif
839- fprintf(stderr,
840- "%4d.%03dMtrips/s [%4d.%06dMtrips/s]\r",
841- a / 1000, a % 1000,
842- b / 1000000, b % 1000000);
843- cr++;
844- }
862+ /* 最速 */
863+ if ( spanSpeed > bestSpeed ) {
864+ bestSpeed = spanSpeed;
865+ if ( gear != GEAR_MAX ) {
866+ tmplCntMax = ((maxSrchCnt / (N_ALU * ALU_BITS)) * gear / 10) / ((STS_SPAN - (STS_SPAN * gear / 10)) / GEAR_SLEEP) / nThread;
867+ }
868+ }
869+
870+ if ( gear != GEAR_MAX ) {
871+ if ( sCnt == YOUSUMI && lCntMax == 0 ) {
872+ if ( tmplCntMax < 1 ) {
873+ lCntMax = 1;
874+ } else {
875+ lCntMax = tmplCntMax;
876+ }
877+ OLDPRINT( "lCntMax = %d\n", lCntMax );
878+ printf( "\nCPU 使用率制限モード開始\n" );
879+ }
880+ }
881+ sCnt++;
882+
883+ status.lastTime = curTime;
884+ status.lastloop = status.loop;
885+
886+ fprintf(stderr,
887+ "通算 %dktrips/s [区間 %dktrips/s] {最速 %dktrips/s}\r",
888+ aveSpeed, spanSpeed, bestSpeed );
845889 }
846890
847891 return 0;
Show on old repository browser