| 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 記述子 */ |
| 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); |
| 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 |
| 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); |
| 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", |
| 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 |
/*************************************************************** |
/*************************************************************** |
| 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; |
| 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 |
{ |
{ |
| 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; |
| 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 ); |
| 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( "優先度を" ); |
| 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 |
| 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; |
| 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; |