問題タブ [stream-compaction]
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.
cuda - Thrust: キー値配列の重複を削除する
同じサイズの配列のペアがあり、それらをキーと値と呼びます。
例えば:
キーがソートされ、各キーに関連付けられた値がソートされます。各キーとそれに対応するキーに関連付けられた値の重複を削除するにはどうすればよいですか?
つまり、上記を次のように圧縮します。
Thrustで利用可能なストリーム圧縮関数を見ましたが、これを行うものを見つけることができませんでした。これはスラストで可能ですか?それとも、独自のカーネルを作成して、ステンシル内の重複をマークして削除する必要がありますか?
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 つの方法はどれも実用的ではないようです。
圧縮が要素の順序を維持することを主張しないと、より効率的な実装が可能になるでしょうか? 私はそれをあきらめることができます。
cassandra - 圧縮中にカサンドラは何をしますか?
私は、cassandraがsstables、row-keysをマージし、トゥームストーンなどをすべて削除することを知っています。
しかし、私はそれがどのように圧縮を実行するかを知ることに本当に興味がありますか?
sstablesは不変であるため、関連するすべてのデータを新しいファイルにコピーしますか?そして、この新しいファイルへの書き込み中に、トゥームストーンでマークされたデータを破棄します。
圧縮が何をするのかは知っていますが、これがどのように発生するのか知りたいです(T)
cassandra - Cassandra クラスター内の同じノードのクリーニングと再結合
24 ノードの Cassandra-0.8.2 クラスターとレプリケーション ファクター 2 があります。ノードの 1 つが非常に遅く、このノードのほとんどの sstables が破損しています (圧縮を実行できず、スクラブも実行できません)。
このノードのデータ、キャッシュ、およびコミットログ ディレクトリを消去し、bootstrap=true で再起動することは可能ですか? すべてのデータ ストリームをこのノードに戻すのに役立ちますか?
可能であれば、問題を引き起こす可能性のあるものはありますか?危険を避けるためにどのような注意を払う必要がありますか?
algorithm - ストリーム圧縮アルゴリズムの最終的な値を理解する
ストリーム圧縮アルゴリズムの最終的な排他的スキャン値はどうなりますか?
これは、すべての「A」文字を選択する例です。
シーケンス A:
シーケンス B (最後の値以外は同じ):
明らかに、2 番目の例は、これらのアドレスに書き込むスキャン値を単純なループで処理することに基づいて、誤った最終結果を示しています。
ここで何が欠けていますか?
アップデート:
スキャンアルゴリズムを理解しているので、次と同等のことを行います。
並行して、これには分散命令が含まれます。
arrays - ブール値の大きな配列を最も軽いサイズのファイルに保存する方法は?
私のプログラムは、ブール値で満たされた大きな配列を生成します。それらをファイルに保存する最もコンパクトな方法が必要です。
私はここでhttp://www.kirupa.com/forum/showthread.php?339670-How-is-boolean-represented-in-memoryを読んで、メモリ内の8つのブール値が1バイトとして表現される可能性があるため、1つのブール値は1ビットです。しかし、これらのブール値の同じコンパクトの配列をファイルに保存するにはどうすればよいですか? 私は知っています-ファイル書き込み関数は、ビットではなくバイトで動作するようなものです。
まもなく - ブール値の配列を Array.Length の 8 分の 1 のサイズでファイルに保存できるようにしたい
cuda - 優先キューを維持するための cuda カーネル内のストリーム圧縮
cuda プログラムの最適化戦略を探しています。カーネルの for ループ内の反復ごとに、各スレッドがスコアを生成します。ブロックごとにスコアの上位 k を維持するために、スコアの共有優先度キューを維持しています。以下の疑似コードを参照してください。
上記のコードが皆さんにとって意味のあるものであることを願っています。今、アトミック操作のオーバーヘッドを削除する方法を探しています。各スレッドは、値が優先キューに送られるかどうかに応じて「1」または「0」を保存します。'1000000000100000000' を '11000000000000000000' バッファーに減らして (または '1' のインデックスを知って)、最終的に '1' に対応するスコアをキューに挿入できるように、カーネル内にストリーム圧縮の実装があるかどうか疑問に思っています。
この場合、「1」は非常にまばらになることに注意してください。
c++ - スラスト zip_iterator を使用した CUDA 配列の圧縮に関する問題
スラスト zip イテレータを使用して複数の CUDA 配列を圧縮しようとすると、紛らわしいエラーが発生します。私の場合は単純です。オブジェクトのステータスを示す整数の Thrust::vector と、オブジェクトの位置と速度を 3D で示す float の 6 つのベクトルがあります。ステータス(整数)ベクトル要素の値が 1 の場合、すべてのベクトルからその要素を削除し、ベクトルを縮小したいと考えています。
この例に従って、7 通りのタプルと述語を使用します。
ただし、これは余分な要素を誤って削除するようです。たとえば、フラグが設定されたオブジェクトが 100 のベクトルに 1 つある場合、圧縮後のベクトルのサイズは 52 であり、予想される 99 ではありません。私は何を逃したのですか?
fortran - Openmp を使用したプレフィックス スキャンによるストリーム圧縮 (または配列パッキング)
コードを並列化するために openmp を使用しています。私は元の配列を持っています:
およびマーク配列:
配列 M を使用すると、元の配列をこのパック配列に圧縮できます。
マルチスレッドアプローチを使用してこの問題を解決したいと思います。C++ 用のライブラリ 'Thrust' はこの問題を解決しますが、Fortran 用の同様のツールを見つけることができません。ストリーム圧縮を実行するために使用できる、C++ の「thrust」のようなライブラリはありますか? または、これを解決するために、fortran と openmp を使用して自分で作成できるアルゴリズムはありますか?