1

Altivec に 32 ビット整数値を並列処理する SIMD コードがあります。場合によっては、整数をリトル エンディアンとしてロードしたい場合もあれば、ビッグ エンディアンとしてロードしたい場合もあります (注: この選択は、ネイティブ CPU のエンディアンに関係なく、実行中のアルゴリズムに基づいています)。実際のバイト スワップの実行は、Altivec の並べ替え操作を使用すると非常に簡単です。Apple が文書化しています。

私が心配しているのは、PowerPC ではビッグ エンディアンまたはリトル エンディアンの操作が許可されているため、リトル エンディアンのロード/ストアまたはビッグ エンディアンのロード/ストアでバイト スワップが必要かどうかわかりません。(現在、私のコードは常にリトル エンディアンで実行され、ビッグ エンディアンのメモリ操作では決してスワップされません。これは、もちろんビッグ エンディアンで実行されているため、現在使用している 970 で正常に動作します)。

私が見つけた限りでは、リトル エンディアン モードの PPC は比較的まれですが、実際には存在します。理想的には、コードがモードに関係なく正しく迅速に動作するようにしたいと考えています。

CPU のエンディアンに関係なく、AltiVec レジスタへのビッグ エンディアンとリトル エンディアンのロードを処理する方法はありますか? これに関連して知っておくべき他の問題はありますか? ウィキペディアには(引用されていない、当然のことながら)声明があります:

「AltiVec の操作は、128 ビットであるにもかかわらず、64 ビットであるかのように扱われます。これにより、AltiVec より前に設計されたリトルエンディアンのマザーボードとの互換性が可能になります。」

これは、リトルエンディアン モードの AltiVec に固有の他の不快感があるかもしれないと私に思わせます。

4

1 に答える 1

2

そこにあるほとんどすべての PowerPC コードはビッグ エンディアンを想定し、そこにあるすべての ARM コードはリトル エンディアンを想定します。

エンディアン スワッピングが使用される特殊なケースがいくつかあります — どうやら VirtualPC はリトル エンディアン モードに依存していたようで、最初は G5 では動作しませんでした (G5 には含まれていません) — しかし、私はこれらについて心配する必要はありません。

ARM はビッグ エンディアン モードでも同様の問題を抱えています。倍精度は混合エンディアンです。「疑似エンディアン」は、下位アドレス ビットを 0x2 (ハーフワード アクセスの場合) および 0x3 (バイト アクセスの場合) で XOR することによって達成されるため、32 ビット ワード内の有効な順序がスワップされますが、これは 64-ビットアクセス。一度に 64 ビットを実行する以外は、同じトリックが PowerPC でも使用されているのではないかと思います。

于 2011-04-07T00:08:25.253 に答える