mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Filename:
 | |
|  *
 | |
|  *   sieve.c
 | |
|  *
 | |
|  * Description:
 | |
|  *
 | |
|  *   The Sieve of Eratosthenes benchmark, from Byte Magazine
 | |
|  *   early 1980s, when a PC would do well to run this in 10 
 | |
|  *   seconds. This version really does count prime numbers
 | |
|  *   but omits the numbers 1, 3 and all even numbers. The
 | |
|  *   expected count is 1899.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <sys/time.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #define SIZE 8190
 | |
| 
 | |
| //#define SIZE 8388608
 | |
| double time_diff(struct timeval x , struct timeval y);
 | |
| 
 | |
| int sieve () {
 | |
| 
 | |
|   unsigned char flags [SIZE + 1];
 | |
|   int iter; 
 | |
|   int count;
 | |
| 
 | |
|   for (iter = 1; iter <= 10; iter++) 
 | |
|     {
 | |
|       int i, prime, k;
 | |
| 
 | |
|       count = 0;
 | |
| 
 | |
|       for (i = 0; i <= SIZE; i++)
 | |
|         flags [i] = 1;
 | |
| 
 | |
|       for (i = 0; i <= SIZE; i++) 
 | |
|         {
 | |
|           if (flags [i]) 
 | |
|             {
 | |
|               prime = i + i + 3;
 | |
|               k = i + prime;
 | |
| 
 | |
|               while (k <= SIZE)
 | |
|                 {
 | |
|                   flags [k] = 0;
 | |
|                   k += prime;
 | |
|                 }
 | |
| 
 | |
|               count++;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|   return count;
 | |
| }
 | |
| 
 | |
| int main () {
 | |
| 
 | |
|   int ans;
 | |
| 
 | |
|   //struct timeval before , after;
 | |
|   //gettimeofday(&before , NULL);
 | |
|     
 | |
|   ans = sieve ();
 | |
|   //gettimeofday(&after , NULL);
 | |
|   /* /\* /\\* if (ans != 1899) *\\/ *\/ */
 | |
|   /* /\* /\\*   printf ("Sieve result wrong, ans = %d, expected 1899", ans); *\\/ *\/ */
 | |
| 
 | |
|   /* /\* //printf("Total time elapsed : %.0lf us\n" , time_diff(before , after) ); *\/ */
 | |
| 
 | |
| 
 | |
|   /* /\* printf("Round 2\n"); *\/ */
 | |
|   /* //gettimeofday(&before , NULL); */
 | |
|     
 | |
|   /* ans = sieve (); */
 | |
|   /* //gettimeofday(&after , NULL); */
 | |
|   /* if (ans != 1899) */
 | |
|   /*   printf ("Sieve result wrong, ans = %d, expected 1899", ans); */
 | |
| 
 | |
|   /* //printf("Total time elapsed : %.0lf us\n" , time_diff(before , after) );  */
 | |
|   
 | |
|   return 0;
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| double time_diff(struct timeval x , struct timeval y)
 | |
| {
 | |
|     double x_ms , y_ms , diff;
 | |
|      
 | |
|     x_ms = (double)x.tv_sec*1000000 + (double)x.tv_usec;
 | |
|     y_ms = (double)y.tv_sec*1000000 + (double)y.tv_usec;
 | |
|      
 | |
|     diff = (double)y_ms - (double)x_ms;
 | |
|      
 | |
|     return diff;
 | |
| }
 | |
|  
 |