[解決済み] C言語プログラムからCPU使用率を100%にする方法
質問
これは非常に興味深い質問なので、状況を説明させてください。私は 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です。
関連
-
関数 'malloc' の暗黙の宣言に対する解決策
-
initializer element is not constant "というエラーが表示されるのですが?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] ファイルのフルパスを取得する方法は?
-
[解決済み] grep -R からディレクトリを除外するにはどうすればよいですか?
-
[解決済み] Windowsのコマンドラインからアプリケーションの終了コードを取得するにはどうすればよいですか?
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み] アプリケーションやプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?
-
[解決済み] Windowsのコマンドラインで、現在の日付/時刻をファイル/フォルダー名で使用するために適切な形式で取得するにはどうすればよいですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C++の配列コピー
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] 1サイクルあたり4FLOPの理論上の最大値を達成するにはどうすればよいですか?
-
[解決済み] .aファイル、.soファイルとは何ですか?