@@ -1571,16 +1571,39 @@ static int test_mp_is_small_prime(void)
1571
1571
return EXIT_FAILURE ;
1572
1572
}
1573
1573
1574
+ #ifdef BENCHMARK_SIEVE
1575
+ #include <time.h>
1576
+ #include <sys/time.h>
1577
+ #define LTM_BILLION 1000000000
1578
+ static uint64_t gettime (void )
1579
+ {
1580
+ struct timespec ts ;
1581
+ clock_gettime (CLOCK_MONOTONIC , & ts );
1582
+ return (((uint64_t )ts .tv_sec ) * LTM_BILLION + (uint64_t )ts .tv_nsec );
1583
+ }
1584
+ static void print_timer (const char * s , const uint64_t start , const uint64_t stop )
1585
+ {
1586
+ printf ("%s%" PRIu64 " min %" PRIu64 " sec %" PRIu64 " ms %" PRIu64 " usec %" PRIu64 " nsec\n" , s ,
1587
+ ((stop - start )/LTM_BILLION ) / 60 ,
1588
+ ((stop - start )/LTM_BILLION ) % 60 ,
1589
+ ((stop - start )/(LTM_BILLION /1000 ))%1000 ,
1590
+ ((stop - start )/(LTM_BILLION /1000000 ))%1000 ,
1591
+ (((stop - start )%LTM_BILLION )%1000 )
1592
+ );
1593
+ }
1594
+ #endif
1595
+
1574
1596
static int test_mp_next_small_prime (void )
1575
1597
{
1576
1598
mp_sieve sieve ;
1577
1599
mp_sieve_prime ret , p ;
1578
1600
mp_int primesum , t ;
1579
1601
int e ;
1580
1602
int i , test_size ;
1581
-
1582
- clock_t start , stop ;
1583
-
1603
+ #ifdef BENCHMARK_SIEVE
1604
+ uint64_t startgt , stopgt ;
1605
+ #endif
1606
+ /* Jumping wildly to and fro */
1584
1607
mp_sieve_prime to_test [] = {
1585
1608
52 , 137 , 153 , 179 , 6 , 153 , 53 , 132 , 150 , 65 ,
1586
1609
27414 , 36339 , 36155 , 11067 , 52060 , 5741 ,
@@ -1600,6 +1623,7 @@ static int test_mp_next_small_prime(void)
1600
1623
1019879761 , 72282701 , 2048787577 , 2058368113
1601
1624
};
1602
1625
1626
+ /* TODO: No, remove 64-bit version, way too big and a bit unwieldy, too! */
1603
1627
#if ( (defined MP_64BIT ) && (defined MP_SIEVE_USE_LARGE_SIEVE ) )
1604
1628
/* primesum up to 2^64
1605
1629
$ time /home/czurnieden/GITHUB/primesum/primesum 2^64
@@ -1613,8 +1637,12 @@ static int test_mp_next_small_prime(void)
1613
1637
/* const char *primesum_64 = "3879578600671960388666457126750869198"; */
1614
1638
1615
1639
const char * primesum_64 = "208139436659661" ;
1640
+ #else
1641
+ #ifdef BENCHMARK_SIEVE
1642
+ const char * primesum_32 = "425649736193687430" ;
1616
1643
#else
1617
1644
const char * primesum_32 = "202259606268580" ;
1645
+ #endif
1618
1646
#endif
1619
1647
1620
1648
mp_sieve_init (& sieve );
@@ -1623,6 +1651,9 @@ static int test_mp_next_small_prime(void)
1623
1651
test_size = (int )(sizeof (to_test )/sizeof (mp_sieve_prime ));
1624
1652
1625
1653
for (i = 0 ; i < test_size ; i ++ ) {
1654
+ #ifdef BENCHMARK_SIEVE
1655
+ startgt = gettime ();
1656
+ #endif
1626
1657
if ((e = mp_next_small_prime (to_test [i ], & ret , & sieve )) != MP_OKAY ) {
1627
1658
fprintf (stderr ,"mp_next_small_prime failed with \"%s\" at index %d\n" ,
1628
1659
mp_error_to_string (e ), i );
@@ -1633,11 +1664,17 @@ static int test_mp_next_small_prime(void)
1633
1664
(unsigned long )to_test [i ], (unsigned long )ret , (unsigned long )tested [i ]);
1634
1665
goto LBL_ERR ;
1635
1666
}
1667
+ #ifdef BENCHMARK_SIEVE
1668
+ stopgt = gettime ();
1669
+ printf ("Single random access for prime: %*u: " , 10 , ret );
1670
+ print_timer ("" ,startgt , stopgt );
1671
+ #endif
1636
1672
}
1637
1673
1638
1674
DOR (mp_init_multi (& primesum , & t , NULL ));
1639
- start = clock ();
1640
- /* Define -DMP_SIEVE_PRIME_MAX_SQRT=0x1ffffffllu to make it feasable */
1675
+ #ifdef BENCHMARK_SIEVE
1676
+ startgt = gettime ();
1677
+ #endif
1641
1678
#if ( (defined MP_64BIT ) && (defined MP_SIEVE_USE_LARGE_SIEVE ) )
1642
1679
for (p = 4293918720lu ; ret < (mp_sieve_prime )4294997297lu ;) {
1643
1680
DO (mp_next_small_prime (p , & ret , & sieve ));
@@ -1646,18 +1683,23 @@ static int test_mp_next_small_prime(void)
1646
1683
DO (mp_add (& primesum , & t , & primesum ));
1647
1684
}
1648
1685
#else
1649
- /* We build the whole sieve instead of just the last segment. Too slow for valgrind */
1686
+ #ifdef BENCHMARK_SIEVE
1687
+ for (p = 0ul ; ret < (mp_sieve_prime )MP_SIEVE_BIGGEST_PRIME ;) {
1688
+ #else
1650
1689
for (p = 4293918720lu ; ret < (mp_sieve_prime )MP_SIEVE_BIGGEST_PRIME ;) {
1690
+ #endif
1651
1691
DO (mp_next_small_prime (p , & ret , & sieve ));
1652
1692
p = ret + 1 ;
1653
1693
mp_set_u32 (& t , ret );
1654
1694
DO (mp_add (& primesum , & t , & primesum ));
1655
1695
}
1656
1696
#endif
1657
- stop = clock ();
1658
- (void )mp_fwrite (& primesum , 10 , stdout );puts ("" );
1659
- printf ("Time for primesum was %.2f seconds\n" ,
1660
- (double )(stop - start )/(double )CLOCKS_PER_SEC );
1697
+ #ifdef BENCHMARK_SIEVE
1698
+ stopgt = gettime ();
1699
+ printf ("Sum of all primes between 0 and %u = " , MP_SIEVE_BIGGEST_PRIME );
1700
+ DO (mp_fwrite (& primesum , 10 , stdout ));
1701
+ print_timer (", computed in " ,startgt , stopgt );
1702
+ #endif
1661
1703
1662
1704
#if ( (defined MP_64BIT ) && (defined MP_SIEVE_USE_LARGE_SIEVE ) )
1663
1705
DO (mp_read_radix (& t , primesum_64 , 10 ));
0 commit comments