| 97 |
int seedOffset; |
int seedOffset; |
| 98 |
int verbose; |
int verbose; |
| 99 |
|
|
| 100 |
|
#define MAX_GEAR 10 |
| 101 |
|
#define MIN_GEAR 1 |
| 102 |
|
#define DEF_GEAR 10 |
| 103 |
|
int gear; |
| 104 |
|
|
| 105 |
unsigned char saltChar[2]; |
unsigned char saltChar[2]; |
| 106 |
|
|
| 107 |
#ifdef ALLKEY |
#ifdef ALLKEY |
| 1208 |
break; |
break; |
| 1209 |
} |
} |
| 1210 |
} |
} |
| 1211 |
printf( "%s [-t num|-m mask] [-s num] [-k salt] [-v] [\"str\"]\n", myName ); |
#ifdef ALLKEY |
| 1212 |
|
printf( "%s [-t num|-m mask] [-s num] [-g num] [-k salt] [-v] [\"str\"]\n", myName ); |
| 1213 |
|
#else /* ALLKEY */ |
| 1214 |
|
printf( "%s [-t num|-m mask] [-s num] [-g num] [-v] [\"str\"]\n", myName ); |
| 1215 |
|
#endif /* ALLKEY */ |
| 1216 |
printf( " -t num : 検索スレッド数 ( %d ≦ num ≦ %d )\n", |
printf( " -t num : 検索スレッド数 ( %d ≦ num ≦ %d )\n", |
| 1217 |
MIN_THREAD, MAX_THREAD ); |
MIN_THREAD, MAX_THREAD ); |
| 1218 |
printf( " -m mask : 実行する CPU を指定するマスク ( 1 ビット ≦ mask のビット数 ≦ %d ビット )\n", |
printf( " -m mask : 実行する CPU を指定するマスク ( 1 ビット ≦ mask のビット数 ≦ %d ビット )\n", |
| 1219 |
MAX_THREAD ); |
MAX_THREAD ); |
| 1220 |
printf( " -s num : 乱数の種 ( 1 ≦ num ≦ %u )\n", UINT_MAX ); |
printf( " -s num : 乱数の種 ( 1 ≦ num ≦ %u )\n", UINT_MAX ); |
| 1221 |
|
printf( " -g num : がんばりぐあい ( %d (やる気なし) ≦ num ≦ %d (フルパワー), デフォルトは、%d )\n", MIN_GEAR, MAX_GEAR, DEF_GEAR ); |
| 1222 |
#ifdef ALLKEY |
#ifdef ALLKEY |
| 1223 |
printf( " -k salt : 塩を指定\n" ); |
printf( " -k salt : 塩を指定\n" ); |
| 1224 |
#endif /* ALLKEY */ |
#endif /* ALLKEY */ |
| 1364 |
|
|
| 1365 |
int xhash_loaded; |
int xhash_loaded; |
| 1366 |
|
|
| 1367 |
|
#if defined(WIN32) |
| 1368 |
|
#define YOUSUMI 6 |
| 1369 |
|
int maxSpeed; /* 一秒間に検索した個数の最大値 (YOUSUMI 回計測中) */ |
| 1370 |
|
int sCnt; /* 速度を表示した回数 */ |
| 1371 |
|
int lCntMax; /* Sleep() のためのループ最大値 */ |
| 1372 |
|
int lCnt; /* Sleep() のためのループカウンタ */ |
| 1373 |
|
#endif /* WIN32 */ |
| 1374 |
|
|
| 1375 |
#define UPDATE_INTERVAL 8 /* 速度表示の間隔 秒 */ |
#define UPDATE_INTERVAL 8 /* 速度表示の間隔 秒 */ |
| 1376 |
struct status { |
struct status { |
| 1377 |
uint64_t startTime; /* 開始時刻 ミリ秒 */ |
uint64_t startTime; /* 開始時刻 ミリ秒 */ |
| 1384 |
|
|
| 1385 |
#if defined(WIN32) |
#if defined(WIN32) |
| 1386 |
SetPriorityClass( GetCurrentProcess(), IDLE_PRIORITY_CLASS ); |
SetPriorityClass( GetCurrentProcess(), IDLE_PRIORITY_CLASS ); |
| 1387 |
|
maxSpeed = 0; |
| 1388 |
|
sCnt = 0; |
| 1389 |
|
lCntMax = 0; |
| 1390 |
|
lCnt = 0; |
| 1391 |
#endif |
#endif |
| 1392 |
|
|
| 1393 |
{ |
{ |
| 1401 |
seed = 0; |
seed = 0; |
| 1402 |
seedOffset = 0; /* コマンドラインオプションではないが、ここで初期化 */ |
seedOffset = 0; /* コマンドラインオプションではないが、ここで初期化 */ |
| 1403 |
verbose = 0; |
verbose = 0; |
| 1404 |
|
gear = DEF_GEAR; |
| 1405 |
#ifdef ALLKEY |
#ifdef ALLKEY |
| 1406 |
fixedSaltChar[0] = '\0'; |
fixedSaltChar[0] = '\0'; |
| 1407 |
while ( (optChar = getopt(argc, argv, "t:m:s:k:vh")) != EOF ) { |
while ( (optChar = getopt(argc, argv, "t:m:s:g:k:vh")) != EOF ) { |
| 1408 |
#else /* ALLKEY */ |
#else /* ALLKEY */ |
| 1409 |
while ( (optChar = getopt(argc, argv, "t:m:s:vh")) != EOF ) { |
while ( (optChar = getopt(argc, argv, "t:m:s:g:vh")) != EOF ) { |
| 1410 |
#endif /* ALLKEY */ |
#endif /* ALLKEY */ |
| 1411 |
switch ( optChar ) { |
switch ( optChar ) { |
| 1412 |
case 't': |
case 't': |
| 1452 |
exit( 1 ); |
exit( 1 ); |
| 1453 |
} |
} |
| 1454 |
break; |
break; |
| 1455 |
|
case 'g': |
| 1456 |
|
gear = atoi( optarg ); |
| 1457 |
|
if ( gear < MIN_GEAR || gear > MAX_GEAR ) { |
| 1458 |
|
usage( argv[0] ); |
| 1459 |
|
exit( 1 ); |
| 1460 |
|
} |
| 1461 |
|
break; |
| 1462 |
#ifdef ALLKEY |
#ifdef ALLKEY |
| 1463 |
case 'k': |
case 'k': |
| 1464 |
if ( strlen( optarg ) != 2 ) { |
if ( strlen( optarg ) != 2 ) { |
| 1572 |
printf( "正規表現 : %s\n", regExpStr ); |
printf( "正規表現 : %s\n", regExpStr ); |
| 1573 |
} |
} |
| 1574 |
#endif /* REON */ |
#endif /* REON */ |
| 1575 |
|
if ( gear != DEF_GEAR ) { |
| 1576 |
|
printf( "がんばりぐあい : %d\n", gear ); |
| 1577 |
|
} |
| 1578 |
} |
} |
| 1579 |
|
|
| 1580 |
/* コードを生成・展開 |
/* コードを生成・展開 |
| 2018 |
|
|
| 2019 |
/* 速度計測 */ |
/* 速度計測 */ |
| 2020 |
status.loop += N_ALU * ALU_BITS; |
status.loop += N_ALU * ALU_BITS; |
| 2021 |
|
|
| 2022 |
|
#if defined(WIN32) |
| 2023 |
|
if ( sCnt >= YOUSUMI ) { |
| 2024 |
|
lCnt++; |
| 2025 |
|
if ( lCnt > lCntMax ) { |
| 2026 |
|
Sleep( (DWORD)10 ); |
| 2027 |
|
lCnt = 0; |
| 2028 |
|
} |
| 2029 |
|
} |
| 2030 |
|
#endif /* WIN32 */ |
| 2031 |
|
|
| 2032 |
if ( status.loop >= status.lastloop + upd_int |
if ( status.loop >= status.lastloop + upd_int |
| 2033 |
&& (curTime = usec()) != status.lastTime ) { |
&& (curTime = usec()) != status.lastTime ) { |
| 2034 |
uint64_t diffTime; |
uint64_t diffTime; |
| 2045 |
/* 区間(単位 trips/sec) */ |
/* 区間(単位 trips/sec) */ |
| 2046 |
diffTime = curTime - status.lastTime; |
diffTime = curTime - status.lastTime; |
| 2047 |
b = USEC_SEC * (status.loop - status.lastloop) / diffTime; |
b = USEC_SEC * (status.loop - status.lastloop) / diffTime; |
| 2048 |
|
#if defined(WIN32) |
| 2049 |
|
if ( gear != DEF_GEAR ) { |
| 2050 |
|
if ( sCnt < YOUSUMI ) { |
| 2051 |
|
if ( b > maxSpeed ) { |
| 2052 |
|
maxSpeed = b; |
| 2053 |
|
/* x = l/s * (gear / (10 - gear)) / 100 */ |
| 2054 |
|
lCntMax = maxSpeed / (N_ALU * ALU_BITS) * (gear * 1000 / (10 - gear)) / 100000; |
| 2055 |
|
if ( lCntMax < 1 ) { |
| 2056 |
|
lCntMax = 1; |
| 2057 |
|
} |
| 2058 |
|
} |
| 2059 |
|
sCnt++; |
| 2060 |
|
} |
| 2061 |
|
} |
| 2062 |
|
#endif /* WIN32 */ |
| 2063 |
/* 予測 */ |
/* 予測 */ |
| 2064 |
c = UPDATE_INTERVAL * b; |
c = UPDATE_INTERVAL * b; |
| 2065 |
/* 立ち上がりなど、誤差があり upd_int が小さすぎたときは |
/* 立ち上がりなど、誤差があり upd_int が小さすぎたときは |