1. ホーム
  2. c

[解決済み] C言語プログラムからCPU使用率を100%にする方法

2023-08-06 15:27:30

質問

これは非常に興味深い質問なので、状況を説明させてください。私は National Museum of Computing で働いていますが、ちょうど 1992 年に製造された Cray Y-MP EL スーパー コンピュータを動かすことができたところなので、それがどれほど速く動作するのか、ぜひ見てみたいのです!

私たちは、素数を計算し、それにかかった時間を示す簡単な C プログラムを書き、そのプログラムを高速な最新のデスクトップ PC で実行し、結果を比較することが最良の方法であると判断しました。

私たちはすぐに、素数を数えるためのこのコードを思いつきました。

#include <stdio.h>
#include <time.h>

void main() {
    clock_t start, end;
    double runTime;
    start = clock();
    int i, num = 1, primes = 0;

    while (num <= 1000) { 
        i = 2; 
        while (i <= num) { 
            if(num % i == 0)
                break;
            i++; 
        }
        if (i == num)
            primes++;

        system("clear");
        printf("%d prime numbers calculated\n",primes);
        num++;
    }

    end = clock();
    runTime = (end - start) / (double) CLOCKS_PER_SEC;
    printf("This machine calculated all %d prime numbers under 1000 in %g seconds\n", primes, runTime);
}

Ubuntu を実行している私たちのデュアル コア ラップトップ (Cray は UNICOS を実行しています) では、CPU 使用率が 100% で、10 分ほどで完全に動作しました。帰宅後、ヘックスコアの最新のゲーム用 PC で試してみることにしましたが、ここで最初の問題が発生しました。

最初に、ゲーム用 PC が使用していた Windows 上で実行するようにコードを適合させましたが、プロセスが CPU の約 15% の電力しか得ていないことに気づき、嘆息しました。これは Windows が Windows であることに違いないと考え、Ubuntu の Live CD を起動し、Ubuntu なら私のラップトップで以前実行したように、プロセスをフルに実行できるだろうと考えました。

しかし、私は 5% しか使用できませんでした! そこで質問ですが、Windows 7 またはライブ Linux で、CPU 使用率 100% でプログラムを実行するにはどうしたらよいでしょうか? もう 1 つ、最終製品を簡単に配布して Windows マシンで実行できる 1 つの .exe にできれば、最高ですが、その必要はありません。

どうもありがとうございました。

P.S. もちろん、このプログラムは Crays 8 スペシャリスト プロセッサでは実際に動作しませんでしたし、それはまったく別の問題です.... もし、90 年代の Cray スーパー コンピュータ上で動作するコードの最適化について何かご存知でしたら、私たちにも声をかけてください!

どのように解決するのですか?

CPUを100%にしたい場合は、1コア以上を使用する必要があります。そのためには、複数のスレッドが必要です。

OpenMPを使った並列版です。

に制限を増やさなければなりませんでした。 1000000 にして、私のマシンでは1秒以上かかるようにしました。

#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;
}

出力します。

このマシンは1000000以下の78498個の素数すべてを29.753秒で計算しました。

これがあなたの100%CPUです。