問題タブ [reduction]
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.
sum - 二重和リダクション opencl チュートリアル
私は OpenCl の初心者です。
double の 1 次元配列に対してリダクション (合計演算子) を操作する必要があります。
私はネットを徘徊してきましたが、見つけた例はかなり混乱しています。誰でも読みやすい (そしておそらく効率的な) チュートリアルの実装を投稿できますか?
追加情報: - 1 つの GPU デバイスにアクセスできます。- カーネル コードに C を使用しています
kernel - WorkGroups ディメンションを変更すると、AMD サンプル リダクションから Opencl Sum Reduction を機能させることができません
次のコードは、amd Web サイトからのものです。
合計削減として機能するように調整しました。
そして、ワークグループを 1 つしか使用しない場合 (つまり、 に与える) は魅力的に機能NULL
しlocal_work_size
ますclEnqueueNDRangeKernel()
が、ワークグループの次元を変更しようとすると、制御不能になります。(私は OpenCl の初心者です)
私がすることは次のとおりです
やり方が悪いのでしょうか??
#define GLOBAL_DIM 60000
さらに、設定すると(これが必要になります)、ローカルメモリが不足することに気付きました。複数のワーク グループを使用すると、「より多くの」ローカル メモリを取得できますか?
parallel-processing - カーネル内の推力を使用したCUDA削減
並列削減を実行したいのですが、共有メモリ内のデータを使用してカーネル内で実行します。これはスラストライブラリで可能ですか?何かのようなもの
しかし、これはカーネル内では機能しません。出来ますか?ありがとうございました。
cuda - CUDA リダクション - 基本
このコードで配列を合計しようとしていますが、スタックしています。このような基本的な操作に多くの時間を費やし、機能させることができないため、おそらく「CUDA for dummies チュートリアル」が必要です。
以下は、私が理解できないこと、または確信が持てないことのリストです。
何個のブロック (dimGrid) を使用する必要がありますか?
N/dimBlock.x/2
カーネルの最初に、グローバルメモリの2つの「ブロック」からデータがロードされ、共有メモリに追加されるため、(N =入力配列の長さ)である必要があると思います元のコードには
blockSize
.blockDim.x
これらの変数の違いがわからないので、に置き換えました。しかし、blockSize
=blockDim.x
の場合、gridSize = blockDim.x*2*gridDim.x
私には意味がありませんgridSize
。N よりも大きくなります。1D 配列のコンテキストでの *Dim.x と *Size の違いは何ですか?主なロジック - カーネルでは、各ブロックは 2*dimBlock(ブロック内のスレッド) の数値を合計します。N = 262144 および dimBlock = 128 の場合、カーネルは部分和の 1024 配列を返します。次に、カーネルを再度実行すると、結果 = 4 つの部分合計が得られます。最後に、最後の実行では、配列が単一のブロックで処理されるため、単一の合計が返されます。
バイナリ配列を合計します。最初の実行では
uchar4
、入力データに使用できます。2 回目と 3 回目の実行では、 を使用しますint
。
何が欠けているのか教えてください
ありがとう
c++ - 認識されないプラグマ:削減句| openMP
以下のコードでは、エラーが発生します:unrecognized #pragma: #pragma omp reduction (+: sum)
。関数自体はすでに並列化されているため、関数内のforループはparallel-for-loopではないことに注意してください。問題はどこにあるのでしょうか?
メインCPPファイル:
関数が定義されている別のcppファイル
digest - SHA-1 ダイジェスト削減
システムに UUID を保存するために QR コード バーコードを使用していますが、生成されたバーコードが自分のものであり、他人のものではないことを確認する必要があります。また、QR コードが下位バージョンの範囲に留まり、スキャンしやすいままになるように、エンコードされたデータを短く保つ必要もあります。
私のアプローチは、UUID の raw 値の数値 (128 ビット値) と 16 ビットのチェックサムを取得し、そのデータを Base64 でエンコードしてから QR コードに変換することです。これまでのところ、これは完全に機能します。
チェックサムを生成するには、UUID の文字列バージョンを取得し、それを長い秘密の文字列と結合し、奇数バイトを XOR して SHA-1 ハッシュを生成します。しかし、このハッシュは長すぎるので、すべての古いバイトを XOR してチェックサムの半分を生成し、同様に偶数バイトを使用して残りの半分を生成します。
私が心配しているのは、SHA-1 システムを不必要に XOR ダウンして侵害したことです。結果内のどこかから、操作されていない 2 バイトだけを取得する方がよいでしょうか? 16 ビットのチェックサムが 160 ビットのチェックサムほど安全ではないことは承知していますが、それはバーコードを使いやすくするために支払わなければならない代償です。私が本当に見つけたくないのは、UUIDが平文で送信されるため、簡単にクラックできるチェックサムを提供したことです。
チェックサムを生成するより良い方法があれば、それも質問に対する適切な答えになります。いつもお時間をいただき、またはこれを読んでいただき、ありがとうございます。回答を投稿していただければ、さらに感謝いたします。
r - R での高調波スピードアップを計算するためのデータ フレームの削減
次の情報を含むデータセットがあります。
- ワークロード名
- 使用した構成
- 測定されたパフォーマンス
ここに、私の問題を説明するおもちゃのデータ セットがあります (パフォーマンス データはまったく意味がありません。例を簡単に理解できるように、さまざまな整数を選択しただけです。実際には、そのデータはパフォーマンス測定から得られた浮動小数点値になります)。
次を使用して生成できます。
さまざまな構成の高調波スピードアップを計算しようとしています。そのためには、基本構成が必要です (この例では cfg = 1)。次に、ハーモニック スピードアップは次のように計算されます。
たとえば、構成 2 の場合は次のようになります。
すべてのワークロード ペアと構成の高調波スピードアップを計算したいと考えています。サンプル データ セットを使用すると、結果は次のようになります。
ループを使用しない解決策を見つけるために苦労してaggregate
いddply
ますが、実用的な解決策を思いつくことができませんでした。したがって、私が直面している基本的な問題は次のとおりです。
- ワークロードと構成の間の関係を処理する方法。特定のワークロード ペア (AB) と特定の構成の結果は、一緒に処理する必要があります (ハーモニック スピードアップ式の分母の最初の 2 つのパフォーマンス測定値はワークロード A から取得され、残りの 2 つはワークロード B から取得されます)。
- ワークロードのペアと構成ごとに、構成ベース (例では cfg 1) の値を使用してパフォーマンス値を「正規化」する必要があります。
aggregate
orなどのR関数でそれを表現する方法がよくわかりませんddply
(可能であれば、まったく)。
これを解決する方法を知っている人はいますか?
編集: 1..8 as を使用perf
すると混乱が生じるのではないかと心配していました。簡単にするためにそうしましたが、値はそれらの値である必要はありません (たとえば、次のように初期化することを想像してください: dframe$perf <- runif(8)
)。ジェームズとザックの両方の回答は、私の質問のその部分が間違っていることを理解していたので、質問でこれを明確にする方がよいと思いました. とにかく、構成1のパフォーマンスが(1、2)ではない場合に対処するために、両方の答えを一般化しました
cuda - CUDA-ワープベースの並列削減が遅いのはなぜですか?
ワープのすべてのスレッドは定義上同期しているので、ワープベースの並列削減について考えました。
したがって、同期を必要とせずに、入力データを64分の1に減らすことができる(各スレッドは2つの要素を減らす)という考え方でした。
Mark Harrisによる元の実装と同じように、削減はブロックレベルで適用され、データは共有メモリにあります。 http://gpgpu.org/static/sc2007/SC07_CUDA_5_Optimization_Harris.pdf
彼のバージョンとワープベースのバージョンをテストするためにカーネルを作成しました。
カーネル自体は、BLOCK_SIZE要素を共有メモリに完全に同じように格納し、その結果を出力配列の一意のブロックインデックスに出力します。
アルゴリズム自体は正常に機能します。「カウント」をテストするために、自分の完全な配列でテストされました。
実装の関数本体:
1.彼のバージョンの実装:
リソース:
4つの同期スレッドが使用されました12if
ステートメントが使用されまし
た11読み取り+追加+書き込み操作
1最終書き込み操作
5レジスタの使用
パフォーマンス:
5回のテスト実行の平均:〜19.54ミリ秒
2.ワープベースのアプローチ:(上記と同じ機能本体)
リソース:
1つのsyncthreadが使用されました7if
ステートメント
10読み取り追加書き込み操作
1最終書き込み操作
5レジスタの使用
5ビットシフト
1追加
1サブ
パフォーマンス:
5回のテスト実行の平均:〜20.82ミリ秒
256mbのfloat値を持つGeforce8800GT512mbで両方のカーネルを複数回テストします。そして、ブロックあたり256スレッドでカーネルを実行します(100%の占有率)。
ワープベースのバージョンは、約1.28ミリ秒遅くなります。
将来のカードでより大きなブロックサイズが許可される場合、最大値が4096で64に減少し、最終的なワープによって1に減少するため、ワープベースのアプローチではそれ以上の同期ステートメントは必要ありません。
なぜそれは速くないのですか?またはアイデアの欠陥はどこにありますか、カーネル?
リソースの使用法から、ワープアプローチを先に進める必要がありますか?
編集1:スレッドの半分だけがアクティブであり、範囲外の読み取りが発生しないようにカーネルを修正し、新しいパフォーマンスデータを追加しました
c++ - モジュラーべき乗 - 巨大なモジュラスを減らす方法は?
剰余累乗の一般的な方程式は、(a + b) MOD n = ((a MOD n) + (b MOD n)) MOD n です。a と b が非常に大きい場合、これはすばらしいことです。ただし、この累乗を非常に大きな n (2^31 -1) で行うように求められましたが、a と b は問題ありません。
nを減らす方法が必要です。
math - ラムダ計算の単純化
以下は、削減するのが難しいと感じているラムダ式です。つまり、この問題の対処方法を理解できません。
(λmn(λsz.ms(nsz)))(λsz.sz)(λsz.sz)
私はこれで迷っています。
誰かが私を正しい方向に導くことができれば、それは大歓迎です