1

厳密なアフィニティルールを持つアプリケーションにCPUホットプラグのサポートを追加したいと思います。各物理コアには正確に1つのスレッドが固定されていますが、CPUにスレッドを固定するために使用するロジックはかなり単純で、0..Nの間のCPUがオフラインの場合は失敗します。

サイズの配列がありMAX_CPU、システム上の各CPUがその識別子によってスロットにマップされるアプローチを選択しました。たとえば、CPU0-> threads[0]、およびCPU1->threads[1]などです。アイデアは、システムのセットアップをミラーリングすることです。

for (i = 0; i < N; ++i)
    set_affinity(threads[i], i);

ただし、オフラインCPUが最後以外の場所で検出された場合、失敗します。

さらに悪いことに、実行時にCPUがオフラインになると、固定されたスレッドのアフィニティマスクが予告なしにリセットされます。

最終的には、次のような複雑なセットアップをサポートしたいと考えています。

CPU0     CPU1      CPU2     CPU3
ONLINE   OFFLINE   ONLINE   OFFLINE

オンラインおよびオフラインのCPUの認識をアプリケーションに組み込むにはどうすればよいですか?

私は避けて/procおり/sys、他のプラットフォーム、特にさまざまなBSDへの移植に興味があるので。今のところx86_64を使用しているので、このcpuid手順が役立つ場合があります。

4

1 に答える 1

0

結局のところsched_getaffinity(2)、この場合には素晴らしく、より適しています。それcpu_set_tが記入するのは、どこでもスケジュールを意味するような一般化されたマスクではなく、実際には、各オンラインおよび許可されたCPU0xffffffff...の詳細で最新のマスクです。マクロを使用すると、オンラインになっているCPUの数と種類を抽出できます。CPU_*

cpu_set_t set;
int i, n;

if (sched_getaffinity(0, sizeof(cpu_set_t), &set))
    return;

n = CPU_COUNT(&set);

/* pin a thread to each online and permitted cpu */
for (i = 0; n; ++i)
    if (CPU_ISSET(i, &set)) {
        /* spawn a thread and pin it to cpu identified by 'i' ... */
        --n;
    }

ホットプラグイベントが通知されると、sched_getaffinity(2)固定されていないスレッドからの呼び出しにより、更新されたマスクが提供されます。

追加の利点は、のようなユーティリティの認識ですtaskset(1)

FreeBSDには、cpuset_getaffinity(2)おそらく同様の方法で動作するシステムコールがあります。今は試してみることができません。

于 2012-08-23T08:54:07.040 に答える