CUDAストリーム圧縮アルゴリズム

デーン・ブチー

整数の配列を取り0、順序を維持するかどうかに関係なくすべてのを削除するCUDAを使用して並列アルゴリズムを構築しようとしています

例:

グローバルメモリ:{0、0、0、0、14、0、0、17、0、0、0、0、13}

ホストメモリの結果:{17、13、14、0、0、...}

最も簡単な方法は、ホストを使用して0'をO(n)時間に削除することです。しかし、私が周りに1000要素を持っていることを考えると、GPUにすべてを残し、送信する前に最初に凝縮する方がおそらく速いでしょう。

推奨される方法は、各スレッドがスタックに(任意の順序で)ポップおよびプッシュできるように、デバイス上のスタックを作成することです。ただし、CUDAにはこれが実装されていないと思います。

同等の(ただしはるかに遅い)方法は、すべてのスレッドが書き込みを終了するまで、書き込みを試行し続けることです。

kernalRemoveSpacing(int * array, int * outArray, int arraySize) {
    if (array[threadId.x] == 0)
        return;

    for (int i = 0; i < arraySize; i++) {

         array = arr[threadId.x];

         __threadfence();

         // If we were the lucky thread we won! 
         // kill the thread and continue re-reincarnated in a different thread
         if (array[i] == arr[threadId.x])
             return;
    }
}

この方法には、O(f(x))時間内に実行するという点でのみ利点f(x)があります。ここで、は配列内にあるゼロ以外の値の平均数です(f(x) ~= ln(n)私の実装では、O(ln(n))時間ですが、O定数が高くなります

最後に、クイックソートやマージソートなどのソートアルゴリズムも問題を解決し、実際にはO(ln(n))相対時間で実行されます。ゼロとゼロの要素のペア、およびゼロ以外の非ゼロの要素のペアの順序付け(順序を維持する必要はありません)に時間を浪費する必要がないため、これよりも高速なアルゴリズムがあると思います。

そのため、どちらの方法が最速かはよくわかりませんが、これを処理するためのより良い方法があると思います。助言がありますか?

user5631621

あなたが求めているのは、ストリーム圧縮1と呼ばれる古典的な並列アルゴリズムです。

推力がオプションの場合は、単にを使用できますthrust::copy_ifこれは安定したアルゴリズムであり、すべての要素の相対的な順序を保持します。

大まかなスケッチ:

#include <thrust/copy.h>

template<typename T>
struct is_non_zero {
    __host__ __device__
    auto operator()(T x) const -> bool {
        return T != 0;
    }
};

// ... your input and output vectors here

thrust::copy_if(input.begin(), input.end(), output.begin(), is_non_zero<int>());

推力がオプションでない場合は、ストリームの圧縮を自分で実装できます(このトピックに関する文献はたくさんあります)。これは楽しくて適度に単純な演習であると同時に、より複雑な並列プリミティブの基本的な構成要素でもあります。

(1)厳密に言えば、そうではありません正確にストリーム圧縮は、伝統的に安定したアルゴリズムであるとして、伝統的な意味でのストリーム圧密が、あなたの要件には、安定性が含まれていません。この緩和された要件は、おそらくより効率的な実装につながる可能性がありますか?

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

PHPの圧縮アルゴリズム

分類Dev

SAPクラスターのデータ圧縮アルゴリズム

分類Dev

Pythonと圧縮アルゴリズムのパフォーマンス

分類Dev

MySQL ネットワーク圧縮アルゴリズムとは

分類Dev

圧縮率が最も高い圧縮アルゴリズムの選択

分類Dev

log4j2新しい圧縮アルゴリズム

分類Dev

数値圧縮アルゴリズムを改善しますか?

分類Dev

圧縮アルゴリズムを論理的に理解する

分類Dev

LZ77圧縮アルゴリズム

分類Dev

Python、単純な圧縮/エンコードアルゴリズム

分類Dev

与えられた圧縮テキストのためのJavaのlzw解凍アルゴリズム

分類Dev

RAR圧縮アルゴリズムはZIP圧縮アルゴリズムよりも圧縮率が高くなっていますか?

分類Dev

画像圧縮に圧縮アルゴリズムを使用する方法、つまりLZ4、LZMA、ZLIB swift

分類Dev

zramにlz4圧縮アルゴリズムを使用させる

分類Dev

URL短縮アルゴリズム

分類Dev

暗号アルゴリズムリスト

分類Dev

可逆圧縮アルゴリズムはビットレベルで機能しますか?

分類Dev

パス圧縮アルゴリズムを使用した加重クイックユニオン

分類Dev

パス圧縮を使用したユニオン検索-Pythonアルゴリズム

分類Dev

GPSウェイポイントの圧縮に適したアルゴリズムはありますか?

分類Dev

PythonでのDNSメッセージNAME圧縮アルゴリズムの実装

分類Dev

これはどのエンコード/圧縮アルゴリズムですか?

分類Dev

文字列が繰り返されるデータに最適な可逆圧縮アルゴリズム

分類Dev

指定されたターゲット画像ファイルサイズを達成するためにjpegを圧縮するアルゴリズム

分類Dev

boost :: computeストリームの圧縮

分類Dev

Javaでカスタムソートアルゴリズム?

分類Dev

カスタムソートアルゴリズムc ++

分類Dev

ソートアルゴリズムc ++

分類Dev

ソートアルゴリズム Java

Related 関連記事

  1. 1

    PHPの圧縮アルゴリズム

  2. 2

    SAPクラスターのデータ圧縮アルゴリズム

  3. 3

    Pythonと圧縮アルゴリズムのパフォーマンス

  4. 4

    MySQL ネットワーク圧縮アルゴリズムとは

  5. 5

    圧縮率が最も高い圧縮アルゴリズムの選択

  6. 6

    log4j2新しい圧縮アルゴリズム

  7. 7

    数値圧縮アルゴリズムを改善しますか?

  8. 8

    圧縮アルゴリズムを論理的に理解する

  9. 9

    LZ77圧縮アルゴリズム

  10. 10

    Python、単純な圧縮/エンコードアルゴリズム

  11. 11

    与えられた圧縮テキストのためのJavaのlzw解凍アルゴリズム

  12. 12

    RAR圧縮アルゴリズムはZIP圧縮アルゴリズムよりも圧縮率が高くなっていますか?

  13. 13

    画像圧縮に圧縮アルゴリズムを使用する方法、つまりLZ4、LZMA、ZLIB swift

  14. 14

    zramにlz4圧縮アルゴリズムを使用させる

  15. 15

    URL短縮アルゴリズム

  16. 16

    暗号アルゴリズムリスト

  17. 17

    可逆圧縮アルゴリズムはビットレベルで機能しますか?

  18. 18

    パス圧縮アルゴリズムを使用した加重クイックユニオン

  19. 19

    パス圧縮を使用したユニオン検索-Pythonアルゴリズム

  20. 20

    GPSウェイポイントの圧縮に適したアルゴリズムはありますか?

  21. 21

    PythonでのDNSメッセージNAME圧縮アルゴリズムの実装

  22. 22

    これはどのエンコード/圧縮アルゴリズムですか?

  23. 23

    文字列が繰り返されるデータに最適な可逆圧縮アルゴリズム

  24. 24

    指定されたターゲット画像ファイルサイズを達成するためにjpegを圧縮するアルゴリズム

  25. 25

    boost :: computeストリームの圧縮

  26. 26

    Javaでカスタムソートアルゴリズム?

  27. 27

    カスタムソートアルゴリズムc ++

  28. 28

    ソートアルゴリズムc ++

  29. 29

    ソートアルゴリズム Java

ホットタグ

アーカイブ