4

チップには 2 つの CPU があり、共有メモリがあります。これは SMP アーキテクチャではありません。共有メモリを備えたチップ上の 2 つの CPU のみ。

最初の CPU には Unix 系のオペレーティング システムがあり、2 番目の CPU には Linux オペレーティング システムがあります。

最初の CPU が何らかのジョブを実行し、このジョブの結果が何らかのデータになります。最初の CPU がジョブを終了した後、ジョブが終了したことを別の CPU に伝える必要があり、2 番目の CPU がこのデータを処理する必要があります。

プロセッサ間通信を処理する方法は何ですか? そのためにはどのアルゴリズムを使用すればよいですか?

それに関する記事への参照は大歓迎です。

4

7 に答える 7

3

それはすべてハードウェアに依存します。共有メモリだけがあり、他の通信方法がない場合は、何らかのポーリングを使用する必要があります。

両方のプロセッサでLinuxが実行されていますか?共有メモリをどのように処理しますか?良い解決策は、リンクリストをFIFOとして使用することです。このFIFOには、住所やサイズなどのデータ記述子を配置します。

たとえば、入力FIFOと出力FIFOを使用して、次のようにすることができます。

  • プロセッサAはいくつかの計算を行います
  • プロセッサAはデータ記述子を出力FIFOにプッシュします
  • プロセッサ入力FIFOでデータ記述子を待機します
  • ループ

  • プロセッサBは出力FIFOでデータ記述子を待機します

  • プロセッサBはデータを処理します
  • プロセッサBは、入力FIFOで使用済みデータ記述子をプッシュします
  • ループ

もちろん、難しい部分はロックにあります。これは「標準」のSMPではないことを強調するために、質問を再定式化する必要があるかもしれません。

メモリで利用可能なアトミックテストおよびセットビット操作がない場合は、メモリの一部のゾーンが一方のプロセッサに対してのみ書き込みで、もう一方のプロセッサに対しては読み取り専用であるスキームを使用する必要があると思います。

編集:あるプロセッサから別のプロセッサにメッセージを渡す方法については、Hasturkunの回答を参照してください。アトミック性の代わりに順序付き書き込みを使用して、事前定義されたデータへのシリアルアクセスを提供します。

于 2009-08-25T08:02:50.600 に答える
2

Ok。私はこの種の問題に取り組んできました。

最初に理解する必要があるのは、2 つの CPU 間に存在する共有メモリの働きです。これらの共有メモリにはさまざまな方法でアクセスできるため、どの方法が最適かを判断する必要があります。

ほとんどの場合、ハードウェア セマフォは共有メモリ内でハードウェア割り込みと共に提供され、あるプロセッサから別のプロセッサへのメッセージ転送を通知します。

ということで、まずはこちらをご覧ください。

于 2009-12-18T17:29:50.033 に答える
1

本当に良い方法は、(ソケットを使用して) IP パケットを送受信することです。これには、オフチップでテストできるという利点があります。たとえば、ネットワークがある場合は、PC で 1 つのプロセスのテスト バージョンを実行します。

于 2009-08-24T07:00:20.437 に答える
1

編集

クイック単方向バージョン:

  • 準備完了フラグ
  • 完了フラグ

初期化:

init()
{
    ready = 0;
    done = 1;
}

ライター:

send()
{
    while (!done)
        sleep();

    /* copy data in */
    done = 0;
    ready = 1;
}

読者:

poll()
{
    while (1)
    {
        if (ready)
        {
            recv();
        }
        sleep();
    }
}

recv()
{
    /* copy data out */
    ready = 0;
    done = 1;
}

共有メモリを介してメッセージ パッシング システムを構築します (両方のプロセッサでキャッシュを解除するか、キャッシュ フラッシュ/無効化呼び出しを使用することにより、一貫性を保つ必要があります)。

共有メモリ構造には、(少なくとも) 次のフィールドが必要です。

  • 現在の所有者
  • メッセージがアクティブです (のように、読む必要があります)
  • リクエストの使用フィールド

フローはおそらく次のようになります: (send/recv 同期が同時に実行されないと仮定)

poll()
{
    /* you're better off using interrupts instead, if you have them */
    while(1)
    {
        if (current_owner == me)
        {
            if (active)
            {
                recv();
            }
            else if (!request[me] && request[other])
            {
                request[other] = 0;
                current_owner = other;
            }
        }
        sleep();
    }
}

recv()
{
    /* copy data... */
    active = 0;
    /* check if we still want it */
    if (!request[me] && request[other])
    {
        request[other] = 0;
        current_owner = other;
    }
}

send()
{
    request[me] = 1;
    while (current_owner != me || active)
    {
        sleep();
    }

    request[me] = 0;

    /* copy data in... */

    /* pass to other side */
    active = 1;
    current_owner = other;
}
于 2009-08-25T08:31:07.767 に答える
1

両方のプロセッサが単一の OS によって管理されている場合、OS がすべてを処理するため、標準 IPC のいずれかを使用して相互に通信できます。それらが異なる OS で実行されている場合は、ソケットが最適です。

于 2009-08-25T08:20:17.757 に答える
0

共有メモリの使用はどうですか?

現在、適切なリンクはありませんが、IPC + 共有メモリをグーグルで検索すると、良い情報が見つかるはずです :)

于 2009-08-24T07:02:05.113 に答える
0

これを行う必要がありますか? 私の経験では、プロセスが複数の CPU を使用する方法をコンパイラとオペレーティング システムに管理させたほうがよいでしょう。

于 2009-08-25T07:44:14.803 に答える