How to get 100% CPU usage from a C program How to get 100% CPU usage from a C program c c

How to get 100% CPU usage from a C program


If you want 100% CPU, you need to use more than 1 core. To do that, you need multiple threads.

Here's a parallel version using OpenMP:

I had to increase the limit to 1000000 to make it take more than 1 second on my machine.

#include <stdio.h>#include <time.h>#include <omp.h>int main() {    double start, end;    double runTime;    start = omp_get_wtime();    int num = 1,primes = 0;    int limit = 1000000;#pragma omp parallel for schedule(dynamic) reduction(+ : primes)    for (num = 1; num <= limit; num++) {         int i = 2;         while(i <= num) {             if(num % i == 0)                break;            i++;         }        if(i == num)            primes++;//      printf("%d prime numbers calculated\n",primes);    }    end = omp_get_wtime();    runTime = end - start;    printf("This machine calculated all %d prime numbers under %d in %g seconds\n",primes,limit,runTime);    return 0;}

Output:

This machine calculated all 78498 prime numbers under 1000000 in 29.753 seconds

Here's your 100% CPU:

enter image description here


You're running one process on a multi-core machine - so it only runs on one core.

The solution is easy enough, since you're just trying to peg the processor - if you have N cores, run your program N times (in parallel, of course).

Example

Here is some code that runs your program NUM_OF_CORES times in parallel. It's POSIXy code - it uses fork - so you should run that under Linux. If what I'm reading about the Cray is correct, it might be easier to port this code than the OpenMP code in the other answer.

#include <stdio.h>#include <time.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#define NUM_OF_CORES 8#define MAX_PRIME 100000void do_primes(){    unsigned long i, num, primes = 0;    for (num = 1; num <= MAX_PRIME; ++num) {        for (i = 2; (i <= num) && (num % i != 0); ++i);        if (i == num)            ++primes;    }    printf("Calculated %d primes.\n", primes);}int main(int argc, char ** argv){    time_t start, end;    time_t run_time;    unsigned long i;    pid_t pids[NUM_OF_CORES];    /* start of test */    start = time(NULL);    for (i = 0; i < NUM_OF_CORES; ++i) {        if (!(pids[i] = fork())) {            do_primes();            exit(0);        }        if (pids[i] < 0) {            perror("Fork");            exit(1);        }    }    for (i = 0; i < NUM_OF_CORES; ++i) {        waitpid(pids[i], NULL, 0);    }    end = time(NULL);    run_time = (end - start);    printf("This machine calculated all prime numbers under %d %d times "           "in %d seconds\n", MAX_PRIME, NUM_OF_CORES, run_time);    return 0;}

Output

$ ./primes Calculated 9592 primes.Calculated 9592 primes.Calculated 9592 primes.Calculated 9592 primes.Calculated 9592 primes.Calculated 9592 primes.Calculated 9592 primes.Calculated 9592 primes.This machine calculated all prime numbers under 100000 8 times in 8 seconds


we really want to see how fast it can go!

Your algorithm to generate prime numbers is very inefficient. Compare it to primegen that generates the 50847534 primes up to 1000000000 in just 8 seconds on a Pentium II-350.

To consume all CPUs easily you could solve an embarrassingly parallel problem e.g., compute Mandelbrot set or use genetic programming to paint Mona Lisa in multiple threads (processes).

Another approach is to take an existing benchmark program for the Cray supercomputer and port it to a modern PC.