問題タブ [altivec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
endianness - PPC のエンディアンに関係なく、Altivec のロードとストアを処理しますか?
Altivec に 32 ビット整数値を並列処理する SIMD コードがあります。場合によっては、整数をリトル エンディアンとしてロードしたい場合もあれば、ビッグ エンディアンとしてロードしたい場合もあります (注: この選択は、ネイティブ CPU のエンディアンに関係なく、実行中のアルゴリズムに基づいています)。実際のバイト スワップの実行は、Altivec の並べ替え操作を使用すると非常に簡単です。Apple が文書化しています。
私が心配しているのは、PowerPC ではビッグ エンディアンまたはリトル エンディアンの操作が許可されているため、リトル エンディアンのロード/ストアまたはビッグ エンディアンのロード/ストアでバイト スワップが必要かどうかわかりません。(現在、私のコードは常にリトル エンディアンで実行され、ビッグ エンディアンのメモリ操作では決してスワップされません。これは、もちろんビッグ エンディアンで実行されているため、現在使用している 970 で正常に動作します)。
私が見つけた限りでは、リトル エンディアン モードの PPC は比較的まれですが、実際には存在します。理想的には、コードがモードに関係なく正しく迅速に動作するようにしたいと考えています。
CPU のエンディアンに関係なく、AltiVec レジスタへのビッグ エンディアンとリトル エンディアンのロードを処理する方法はありますか? これに関連して知っておくべき他の問題はありますか? ウィキペディアには(引用されていない、当然のことながら)声明があります:
「AltiVec の操作は、128 ビットであるにもかかわらず、64 ビットであるかのように扱われます。これにより、AltiVec より前に設計されたリトルエンディアンのマザーボードとの互換性が可能になります。」
これは、リトルエンディアン モードの AltiVec に固有の他の不快感があるかもしれないと私に思わせます。
optimization - Apple の PowerPC memcpy が高速な理由は何ですか?
PowerPC での優れたメモリ戦略を求めて、いくつかのコピー関数を作成しました。Altivec または fp レジスタをキャッシュ ヒント (dcb*) と共に使用すると、大きなデータの単純なバイト コピー ループよりもパフォーマンスが 2 倍になります。最初はそれに満足していたので、通常の memcpy を投入して比較してみました...私のベストよりも 10 倍高速です! memcpy を書き直すつもりはありませんが、memcpy から学び、ほとんどの時間をメモリとの間でピクセルを移動するのに費やすいくつかの単純な画像フィルタを高速化したいと考えています。
サメの分析では、内部ループが dcbt を使用してプリフェッチし、4 つのベクトル読み取りと 4 つのベクトル書き込みを行っていることが明らかになりました。反復ごとに 64 バイトを運ぶように私の最高の関数を微調整した後でも、memcpy のパフォーマンス上の利点は依然として恥ずかしいものです。私は dcbz を使用して帯域幅を解放しています。Apple は何も使用していませんが、どちらのコードもストアで躊躇する傾向があります。
非常によく似たコードに劇的なパフォーマンスのギャップがある理由について、誰か考えがありますか? memcpy が使用している秘密のソースに実画像フィルターをマリネしたいです!
追加情報: すべてのデータはベクトルで整列されています。元の画像を置き換えるのではなく、画像のフィルター処理されたコピーを作成しています。コードは PowerPC G4、G5、および Cell PPU で実行されます。Cell SPU版はすでにめちゃくちゃ速いです。
c++ - altivec C++ 拡張機能に対する Eclipse CDT エディターのサポート?
Eclipse CDT C++ エディターには、Altivec C++ 言語拡張をサポートする手段がありますか? たとえば、-maltivec でコンパイルするときに GNU g++ コンパイラーに実装されていますか?
具体的には、ベクトル データ型を構文エラーとして報告しないようにすることはできますか? 例えば
16 個の 8 ビット符号なし文字を含む「foo」という名前の 128 ビット ベクトル変数を宣言します。
simd - MMX/SSE命令をAltiVecに移植する
はじめに..私はASMの経験が非常に限られており、SIMDの経験はさらに少ないです。
しかし、次のMMX / SSE最適化コードがあり、PPC/Cellプロセッサで使用するためにAltiVec命令に移植したいと思います。
これはおそらく大きな質問です。数行のコードですが、ここで何が起こっているのかを理解するのに問題はありませんでした。
元の機能:
AltiVec命令を使用するためにこれを書き直す方法に関するヒントはありますか?
私の最初の試み(非常に間違った試み)は次のようになります。しかし、それは完全に(またはリモートでさえ)正しくありません。
c++ - 浮動小数点値に相当するAltiVecvec_msum
float値のベクトルに対してvec_msum機能を実現する方法を知っている人はいますか?
私はSIMDにまったく慣れていません。私はそれを理解し始めていると思いますが、まだいくつかのパズルがあります。
私の最終目標は、関数 "convolve_altivec"(この質問の受け入れられた回答にある)を書き直して、入力パラメーターをshortではなくfloat値として受け入れるようにすることです。
つまり、プロトタイプは
以下の元の最適化されていない関数によって提供される機能を一致させようとしています。
私の最初の努力は、この同じ関数の既存のSSEバージョンをaltivec命令に移植しようとしているのを見てきました。
c++ - ユニオンを使用してクラスメンバー変数に同じメモリを割り当てる
既存の Vector クラスをベクトル化しようとしています
これらのメンバー変数にアクセスする他のクラスに影響を与えずに、クラス メンバーをベクトル化しようとしています。
しかし、メンバ名 X、Y、Z が見つからないため、コンパイル エラーが発生します。変数を取得する別の方法はありますか?
参考までに、このvector float
型はIBM™ Cell Broadband Engine™ Software Development Kit V3.0 for Multicore Accelerationからのものです。
sse - 分散インデックスを収集インデックスに変換する効率的な方法は?
SIMD 組み込み関数を使用してストリーム圧縮 (配列を取得し、空の要素を取り除く) を作成しようとしています。ループの各反復では、一度に 8 つの要素が処理されます (SIMD 幅)。
SSE 組み込み関数を使用すると、_mm_shuffle_epi8() を使用してこれをかなり効率的に実行できます。これは、16 エントリのテーブル ルックアップ (並列コンピューティング用語で収集) を実行します。シャッフル インデックスは事前に計算され、ビット マスクで検索されます。
私の問題は、Altivec SIMD にもこれを実装したいということです (理由は聞かないでください - 見当違いのビジネス上の決定です)。Altivec には、重要な要素である _mm_movemask_epi8() に相当するものはありません。だから、私はどちらかへの方法を見つける必要があります
エミュレート _mm_movemask_epi8() - コストがかかるようで、いくつかのシフトと OR
シャッフル インデックスを効率的に直接生成する -
つまり、インデックス i は、圧縮されていないデータの i 番目の有効な要素のインデックスになります。
これをシリアルに行うのは簡単ですが、パラレル (SIMD) にする必要があります。プレフィックスサムを使用してスキャッター インデックスを生成するのは簡単に思えますが、AltiVec も SSE もスキャッター命令を持たないため、代わりにインデックスを収集する必要があります。収集インデックスは分散インデックスの逆関数ですが、どのように並行して取得できますか? GPU プログラミングの黎明期には、スキャッターをギャザーに変換するのが一般的な手法だったことは知っていますが、説明されているこれら 2 つの方法はどれも実用的ではないようです。
圧縮が要素の順序を維持することを主張しないと、より効率的な実装が可能になるでしょうか? 私はそれをあきらめることができます。
simd - SIMD命令による無効なメモリ負荷の回避
SIMDロード命令を使用してメモリから要素をロードしています。たとえば、Altivecを使用して、アドレスが整列していると仮定しています。
ここで、SIZEがFLOAT_VEC_SIZEの倍数でない場合、最後のループ反復でV0に無効なメモリ要素が含まれている可能性があります。これを回避する1つの方法は、ループを1回繰り返すことです。別の方法は、潜在的な無効な要素をマスクすることです。他に役立つトリックはありますか?上記を考慮すると、ネストされたループのセットの中で最も内側にあります。したがって、SIMD以外の追加の命令には、パフォーマンスの低下が伴います。
simd - fftw simd-altivec.h がコンパイルできない
Xcode 4.4 を使用して Mac で fftw を使用しています。私のプロジェクトでは、fftw ソース コード全体をプロジェクトに追加し、コンパイルしようとしました。
simd-altivec.h で次のようなエラーが発生するため、正常にコンパイルできません。
ALTIVEC は単精度でのみ機能します
simd-altivec.h のコンパイルには -maltivec または同等のものが必要です
未知の型ベクトル
不明なタイプ V
私の質問は次のとおりです。
プロジェクトにサードパーティのライブラリを追加するより良い方法は何ですか? すべてのソース ファイルを自分のプロジェクトに直接追加するのは面倒に思えます...
次に、simd-altivec.h のエラーをどのように処理すればよいですか? simd-altivec.h は何をしますか?
sse - x264 ライブラリの速度 - Altivec vs SSE4 -
シンプルで安価なデュアルコア intel-3ghz-debian と、超高価な powerPc7-Aix へのアクセスがあります。
そして、数日間の闘争の後、libx264 をコンパイルし、両方のコンピューターでテストしました。
- GCC: Intel 上のライブラリ x264 (SSE2 機能付き) および
- 16 コアの powerPc 上の GCC (altivec を使用)。
...そしてその結果、安価な Intel はx2 倍高速です! (altivec を無効にすると、Intel は 10 倍速くなります)
私の質問: これは正常ですか? 他のすべての powerPC ユーザーの結果は同じですか? x264 ライブラリの powerPc-altivec-optimisation は Intel と同じ速度で動作しますか? または MMX/SSE 最適化は公式にはこのライブラリで少なくとも 2 倍高速ですか?
マルチスレッドオプションには興味がありません。コア数とスレッド数は関係ありません。rawvideo をソースとして使用するデフォルトの「ミディアム プリセット」を使用したシンプルな 1 スレッド x264 エンコーディング、sse と altivec の比較。
ネイティブの Aix XLC コンパイラがより良い結果を提供するのではないでしょうか? (私はgccのみが動作するように管理しました)
... mac-powerpc-users は、これについて何か知っているかもしれません。