SIMDを使用してバケットソート/分類できますか?

ヴェルダゴン

SIMDに興味があり、このユースケースを処理できるかどうか疑問に思っています。

[0x018A、0x004B、0x01C0、0x0234、0x0098、0x0343、0x0222、0x0301、0x0398、0x0087、0x0167、0x0389、0x03F2、0x0034、0x0345、...]のような2048個の整数の配列があるとします。

それらがすべて0x00、0x01、0x02、または0x03のいずれかで始まることに注意してください。それらを4つの配列に分割したい:

  • 0x00で始まるすべての整数に1つ
  • 0x01で始まるすべての整数に1つ
  • 0x02で始まるすべての整数に1つ
  • 0x03で始まるすべての整数に1つ

私は次のようなコードがあると思います:

int main() {
   uint16_t in[2048] = ...;

   // 4 arrays, one for each category
   uint16_t out[4][2048];

   // Pointers to the next available slot in each of the arrays
   uint16_t *nextOut[4] = { out[0], out[1], out[2], out[3] };

   for (uint16_t *nextIn = in; nextIn < 2048; nextIn += 4) {

       (*** magic simd instructions here ***)

       // Equivalent non-simd code:
       uint16_t categories[4];
       for (int i = 0; i < 4; i++) {
           categories[i] = nextIn[i] & 0xFF00;
       }
       for (int i = 0; i < 4; i++) {
           uint16_t category = categories[i];
           *nextOut[category] = nextIn[i];
           nextOut[category]++;
       }
   }
   // Now I have my categoried arrays!
}

私の最初の内部ループはSIMDを必要とせず、単なる命令である可能性(x & 0xFF00FF00FF00FF00)があると思いますが、その2番目の内部ループをSIMD命令にできるかどうか疑問に思います。

私が行っているこの「分類」アクションのためのSIMD命令のようなものはありますか?

「挿入」の手順はやや有望に思えますがhttps://software.intel.com/en-us/node/695331の説明を理解するには少し環境に配慮しています

そうでない場合、何かが近づいていますか?

ありがとう!

BeeOnRope

SIMDを使用してそれを行うことができますが、その速度は、使用可能な命令セットと、実装がどれだけ賢いかによって異なります。

1つのアプローチは、配列を取得して「ふるいにかけ」、異なるバケットに属する要素を分離することです。たとえば、16個の16ビット要素を持つ配列から32バイトを取得します。いくつかのcmpgt手順を使用して、各要素が00 + 01バケットに分類されるかバケットに分類されるかを決定するマスクを取得02 + 03ます。次に、ある種の「圧縮」または「フィルター」操作を使用して、マスクされたすべての要素をレジスターの一方の端に連続して移動し、マスクされていない要素についても同じように移動します。

次に、整理するために、この1以上の時間繰り返して00から0102からを03

AVX2を使用すると、「圧縮」操作のインスピレーションを得るために、この質問から始めることができますAVX512を使用すると、このvcompress命令を使用して支援することができます。これは正確にこの操作を実行しますが、32ビットまたは64ビットの粒度でのみ実行されるため、少なくともベクトルごとにいくつか実行する必要があります。

N個のベクトルをロードし、それらを交換して0番目のベクトルの要素が最小になるようにする垂直アプローチを試すこともできます。この時点で、圧縮段階にさらに最適化されたアルゴリズムを使用できます(たとえば、十分な数のベクトルを垂直方向に並べ替えます。最後のベクトルは完全に0x00etcで始まる場合があります)。

最後に、ソースで、または前処理ステップとして、データを別の方法で編成することも検討できます。つまり、ペイロードバイトから常に0〜3である「カテゴリ」バイトを分離します。処理ステップの多くはどちらか一方でのみ実行する必要があるため、それらをそのように分割することで効率を高めることができる可能性があります。たとえば、すべてのカテゴリである32バイトに対して比較操作を実行してから、32ペイロードバイトに対して圧縮操作を実行できます(少なくとも、各カテゴリが一意である最後のステップで)。

これにより、「カテゴリ」バイトが暗黙的に含まれる16ビット要素ではなく、バイト要素の配列が生成されます。データサイズを半分に削減しました。これにより、将来データで実行したい他のすべての処理が高速化される可能性があります。

この形式でソースデータを生成できない場合は、ペイロードを適切なバケットに配置するときにタグバイトを削除する機会としてバケットを使用できるため、出力はuint8_t out[4][2048];です。pshufbコメントで説明されているようにバイトシャッフルを使用してSIMD左パックを実行している場合は、ペイロードバイトのみを下位半分にパックするシャッフル制御ベクトルを選択できます。

(AVX512BWまで、x86 SIMDには可変制御ワードシャッフルがなく、バイトまたはdwordのみであるため、ペイロードバイトを最下部にパックすると同時に、ペイロードをタグから簡単に分離できるバイトシャッフルがすでに必要でした。 )

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

CNN分類でテンソルフローを使用して混同行列をプロットします

分類Dev

サーバソケットを書くときに、クライアントソケットは読み込みまでは待機していますか?

分類Dev

クライアントソケットがサーバーソケットを見つけることができません。同じポート番号を使用しているにもかかわらず、UnknownHostExceptionをスローします

分類Dev

CPUが1つしかない場合、サーバーマザーボードのすべてのメモリソケットを使用できますか?

分類Dev

Javaのソケットを使用して2台のコンピューターを接続できますか?

分類Dev

Androidでソケットを使用していますか?

分類Dev

OpenSSLソケットでselect()を使用していますか?

分類Dev

App EngineソケットパッケージをWebソケットに使用できますか?

分類Dev

Pythonでドメインソケットを使用してローカルサーバーをセットアップしますか?

分類Dev

Pythonソケットを使用してFTPサーバーを構築します

分類Dev

Sharpsnmpを使用してパケットをデコードできますか?

分類Dev

どうすればflask-socketioを使用してフラスコルートからソケットにメッセージを送信できますか

分類Dev

UDPサーバーソケットは、受信したすべてのデータを解析できません

分類Dev

オブジェクトをバケットにソートするには、有効なJPQL式としてどのように定式化できますか?

分類Dev

ソケットを使用してTCP経由でサーバー側からクライアント側にArrayList <String>を送信しますか?

分類Dev

2つのJavaアプリケーションがjavelinWebソケットを介して通信できますか?

分類Dev

Ubuntuを使用してC ++ソケットから行を読み取ることはできますか?

分類Dev

半連続ターゲットからの情報を使用して、改善されたバイナリ分類器を作成しますか?

分類Dev

反対側でサーバーソケットが開いているかどうかを確認します

分類Dev

イーサネットケーブルを使用してUSBケーブルを延長できますか?

分類Dev

`readxl`パッケージを使用して色付きのセルを分類します

分類Dev

単層ニューラルネットワークで10を超える入力を使用して、2つのカテゴリに分類できます

分類Dev

rufus-schedulerを使用してレールでコントローラーメソッドをスケジュールできますか?

分類Dev

AWS CLIを使用してバケットにポリシーを追加するときにbash変数を使用できますか?

分類Dev

バートシーケンス分類でゼロより大きいバッチサイズを使用する方法

分類Dev

同じUDPソケットを介して同時にデータを送受信できますか?

分類Dev

回帰ではなくsvmLinearカラットパッケージを使用して分類を行う方法

分類Dev

間に分類器を使用してカスケードネットワークをトレーニングします

分類Dev

Javaソケット:クライアントがサーバーからメッセージを受信できるかどうかを確認します

Related 関連記事

  1. 1

    CNN分類でテンソルフローを使用して混同行列をプロットします

  2. 2

    サーバソケットを書くときに、クライアントソケットは読み込みまでは待機していますか?

  3. 3

    クライアントソケットがサーバーソケットを見つけることができません。同じポート番号を使用しているにもかかわらず、UnknownHostExceptionをスローします

  4. 4

    CPUが1つしかない場合、サーバーマザーボードのすべてのメモリソケットを使用できますか?

  5. 5

    Javaのソケットを使用して2台のコンピューターを接続できますか?

  6. 6

    Androidでソケットを使用していますか?

  7. 7

    OpenSSLソケットでselect()を使用していますか?

  8. 8

    App EngineソケットパッケージをWebソケットに使用できますか?

  9. 9

    Pythonでドメインソケットを使用してローカルサーバーをセットアップしますか?

  10. 10

    Pythonソケットを使用してFTPサーバーを構築します

  11. 11

    Sharpsnmpを使用してパケットをデコードできますか?

  12. 12

    どうすればflask-socketioを使用してフラスコルートからソケットにメッセージを送信できますか

  13. 13

    UDPサーバーソケットは、受信したすべてのデータを解析できません

  14. 14

    オブジェクトをバケットにソートするには、有効なJPQL式としてどのように定式化できますか?

  15. 15

    ソケットを使用してTCP経由でサーバー側からクライアント側にArrayList <String>を送信しますか?

  16. 16

    2つのJavaアプリケーションがjavelinWebソケットを介して通信できますか?

  17. 17

    Ubuntuを使用してC ++ソケットから行を読み取ることはできますか?

  18. 18

    半連続ターゲットからの情報を使用して、改善されたバイナリ分類器を作成しますか?

  19. 19

    反対側でサーバーソケットが開いているかどうかを確認します

  20. 20

    イーサネットケーブルを使用してUSBケーブルを延長できますか?

  21. 21

    `readxl`パッケージを使用して色付きのセルを分類します

  22. 22

    単層ニューラルネットワークで10を超える入力を使用して、2つのカテゴリに分類できます

  23. 23

    rufus-schedulerを使用してレールでコントローラーメソッドをスケジュールできますか?

  24. 24

    AWS CLIを使用してバケットにポリシーを追加するときにbash変数を使用できますか?

  25. 25

    バートシーケンス分類でゼロより大きいバッチサイズを使用する方法

  26. 26

    同じUDPソケットを介して同時にデータを送受信できますか?

  27. 27

    回帰ではなくsvmLinearカラットパッケージを使用して分類を行う方法

  28. 28

    間に分類器を使用してカスケードネットワークをトレーニングします

  29. 29

    Javaソケット:クライアントがサーバーからメッセージを受信できるかどうかを確認します

ホットタグ

アーカイブ