スレッド化と並列処理をいじってみたいです。プロセッサに複数のコアがあることは知っていますが、それぞれで何が起こっているかを確認する方法がわかりません。この情報にアクセスする正しい方法は何ですか?
より具体的には、次のことを計画しています。複数のスレッドを起動する小さなプログラムを作成することを想像します。これらのスレッドはコア全体に分散され、必要に応じて相互に通信する必要があります。どのスレッドが実行されているかを観察できるようにしたいのですが、ヒントはありますか?
私はこの種のことを試すのはまったく新しいです(この質問に直接対処しない、これに関連する情報にも非常に満足しています)。
最高、バート
(グーグルで「cat/proc/cpuinfo」にたどり着いただけです。これは、7つのプロセッサがあることを示しているようです。これは本当の事実ではなく、この出力の読み方がわからないことを示しています。)
プロセッサの数:番号付けは0から始まるので、プロセッサ1がある場合は、少なくとも2つあることに注意してください。
スレッドへのバインドスレッドはCPUにバインドされません(cpulimit&coを使用してトリックを実行しない限り、ほとんどの場合、バインドしないでください)。カーネルを1000Hzで構成し、I/Oがないと仮定すると、コンテキストスイッチは1秒間に1000回実行されます。 2つのプロセッサのセットアップでは、現時点で約300のスレッドが実行されています。つまり、プロセスごとに6.(6)スロットが割り当てられます。どの秒でも、各プロセスが両方のコアを占めると想定するのは安全です。
与えられた-階段アルゴリズムでは、I/Oはそれを真にする必要はありませんが、1秒の各スレッドは両方のコア上にある可能性があります-待機中はどこにも実行されません(したがって、どのコアにもバインドされません)。
ハイパースレッディングハイパースレッディングを備えた4コアのIntel iXがあると思います(デュアルプロセッサマシンを使用している場合を除く)。ハイパースレッディングは、別のコアをエミュレートすることで機能します。したがって、プロセスが1つのコアでI/Oを待機している場合、別のコアの実行に切り替えることができます。これはもちろん、問題をさらに複雑にします。
各コアは/proc/cpuinfo
に独自のエントリを取得するため、ここには冗長な情報がたくさんあります。
使用しているCPUやコアの数の概要を取得するには、次のようにします。
# egrep 'processor|core id|physical id' /proc/cpuinfo
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
これは私のシングルチップ、デュアルコアコンピューターで実行されます。したがって、0と1の番号が付けられた2つのコアがありますが、どちらも物理CPU0に属しています。
コンピューターの人は0から数えるのが好きです。覚えておいてください。
デュアルCPU、シングルコアシステムからの出力は次のとおりです。
$ egrep 'processor|core id|physical id' /proc/cpuinfo
processor : 0
processor : 1
だから私は2つのCPUを持っていますが、コアが指定されていないので、各プロセッサチップが1つのコアを持っていることがわかります。
もう少し面白いもの:
$ egrep 'processor|core id|physical id' /proc/cpuinfo
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
processor : 2
physical id : 1
core id : 0
processor : 3
physical id : 1
core id : 1
これが私のデュアルCPUデュアルコアシステムです。私は「プロセッサ」0〜3を持っており、それぞれがコア0または1としてプロセッサ0または1に存在します。
あなたはその考えを理解します。
そうは言っても、プロセッサ0から7を備えたデュアルCPUクアッドコアシステムを使用していると思います。