問題タブ [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.

0 投票する
2 に答える
1547 参照

cuda - CUDA: このコードを並列化するにはどうすればよいですか?

コードを並行して実行する(CUDA)ように一生懸命努力しています。単純化されたコードは次のとおりです。

私が抱えている問題は、スレッド間で共有sum+=fする必要があるためです。sum ( ) を宣言するときsumに引数を使用しようとしましたが、うまくいきませんでした (適切な結果が得られませんでした)。リダクションについても聞いたことがありますが (OpenMP での使用方法も知っています)、ここでの適用方法がわかりません。__shared____shared__ float sum

どんな助けでも大歓迎です。ありがとう!

0 投票する
2 に答える
190 参照

lambda - ラムダ計算でβ還元を使用して式を評価するにはどうすればよいですか?

次の式を評価したい:

βリダクションを使用します。

答えは次のとおりです。

しかし、私は第2段階を理解していません:

ここから:(λx.y)((λz.zz)(λw.w))ここへ(λx.y)((λw.w)(λw.w))

私たちはそこで何をしていますか?私の理解では、α等価ルールを使用する必要があります。

0 投票する
2 に答える
3878 参照

syntax - Fortran の配列でリダクションを使用するには?

私はopenMPを学び始めたばかりで、次のものを持っています...

co(k) と si(k) を正しく追加するには、それらを削減する必要があることを理解しました (私が思うに) が、私が知る限り、次のような配列を持つことはできません。削減条項内のこと。どうすればこれを行うことができますか?

0 投票する
2 に答える
4914 参照

cuda - 並列縮小の例

共有メモリを使用するスタンフォードのこの並列削減コードを見つけました。

コードは、262144 に等しい 1<<18 の要素数の例であり、正しい結果が得られます。

特定の数の要素では正しい結果が得られ、200000 や 25000 などの他の数の要素では予想とは異なる結果が得られるのはなぜですか? 私には、必要なスレッドブロックを常に指定しているように見えます

0 投票する
1 に答える
2409 参照

variables - 還元変数とは何ですか?誰かが私にいくつかの例を教えてもらえますか?

還元変数とは何ですか?誰かが私にいくつかの例を教えてもらえますか?

0 投票する
1 に答える
531 参照

opencl - プライベートからローカル、そしてグローバルへのOpenCL削減?

次のカーネルは音圧フィールドを計算します。各スレッドは、pressureベクトルの独自のプライベート インスタンスを計算し、グローバル メモリに合計する必要があります。pressureベクトルを計算するコードが正しいと確信していますが、これで期待どおりの結果が得られるようにするのにまだ問題があります。

データの次元に関するいくつかの注意事項: スレッドの総数は 100 から 2000 の間で変化しますが、場合によってはこの範囲外になることがあります。
groupSizeハードウェアに依存しますが、現在、1(cpu) から 32(gpu) の間の値を使用しています。
HYD_DIM_TOTALコンパイル時に認識され、4 から 32 の間で変化します (通常は 2 の累乗になりますが、必ずしもそうではありません)。

このリダクション コードに明らかに間違っている点はありますか?

PS: AMD APP SDK 2.8 を搭載した i7 3930k と NVIDIA GTX580 でこれを実行しました。

0 投票する
3 に答える
3925 参照

list - Haskellでその場でリストを減らす

fある入力を受け入れて数値を生成する関数があると仮定します。関数内でf、入力に従ってリストが作成され、その後、(たとえばを使用してfoldl' g)縮小されて、最終的な出力番号が生成されます。g 結局、中間リストはリデュースされるので、中間リストを表現せずにリデュース機能を適用することは可能ですか。ここでの目標は、リストの保存(または、精度の低い単語を「保存」する場合は表現)に使用されるメモリを制限することです。

これを説明するために、この関数は中間リスト用のスペースをfoldPairProduct取りO(N1 * N2)ます(消費されるスペースは、式と遅延評価のために複雑になる可能性がありますが、比例またはそれより悪いと思います)。N1, N22つの入力リストのサイズは次のとおりです。

ロジックの代替実装はfoldPairProduct'で、これはO(2 * 2)スペースを取ります。

複数のリストを入力として受け入れることを除いてfoldCrossProduct、実装が類似している場合、状況は悪化します。foldPairProduct中間リストのスペースの複雑さ(命令型言語の意味では)はO(N1 * N2 * ...* Nk)、です。ここkで、はの長さです[[a]]

の実装アイデアに従った場合foldPairProduct'、スペースの複雑さはk^2、はるかにスペース効率が高くなります。私の質問は次のとおりです。

  1. foldPairProduct'私はリストのペアのために実装しました。ただし、任意の数のリストに実装するのは簡単ではないようです。

  2. Haskellを命令型言語と比較するつもりはありませんが、一定のスペースを使用する(つまり、言及された長さの中間リストを表現せずに)実装はありますか?たぶんモナドは助けになるでしょうが、私はそれにとても慣れていません。

  3. コンパイラは実際にその魔法を実行しますか?つまり、リストが中間であり、削減されることに気づき、実際にスペース効率でリストを評価する方法を見つけ出します。結局のところ、それが遅延評価とコンパイラ最適化が設計されていると私が思ったものです。

  4. コメントは大歓迎です。ありがとう。

アップデート1

パフォーマンステストでは、入力サイズの変化に基づいて、foldPairProductおよびの「スペースの複雑さ」に関する分析と、 GCによってコピーされたバイト数の観察が確認されました。 foldCrossProductN1, N2, N3

パフォーマンステストは、foldPairProduct'驚くべきことにN1 * N2、またはさらに悪いスペース使用量を示した分析を否定します。これはおそらく、再帰呼び出しが非効率的に評価されているためです。結果は以下に添付されています(ghc設定はYurasが行ったものと同じです)。

アップデート2

コメントと回答から学んだように、いくつかのさらなる実験を更新しました。の場合、使用中のメモリfoldPairProductの合計は、DanielFischerが説明したスペースの複雑さと一致しています。

なぜならfoldCrossProduct、ダニエルの複雑さの分析は私には理にかなっていますが、結果は線形のメモリ使用量を示していません。ダニエルのアドバイスに従って、とを入れ替えるx <- xsy <- crossproduct ys、実際に線形空間の複雑さが実現します。

の場合foldCrossProduct (max) [[1..100],[1..n], [1..1000]]、n = 100、1000、10000、100000の場合、使用されるメモリは2、2、3、14MBです。

foldPairProduct [1..n] [1..10000]

foldPairProduct [1..10000] [1..n]

foldPairProduct [1..n] [1..n]

foldCrossProduct(max)[[1..n]、[1..100]、[1..1000]]

foldCrossProduct(max)[[1..100]、[1..n]、[1..1000]]

foldPairProduct'[1..n] [1..n]

0 投票する
3 に答える
228 参照

python - Pythonでのランダム化によるテキストファイルの削減

私はbashで次の問題を解決しましたが、ファイルのサイズを減らす必要があることを考えると、非常に非効率的で非常に遅いと感じています。誰かがPythonで同じことを行う方法を知っていて、うまくいけば物事をスピードアップすることを望んでいました。

元々の問題は、非常に大きなテキストファイル(5000万から6000万行、タブ区切りの列)を減らすことでした。列の1つがキーとして扱われています。つまり、ファイル内に一意のキーを持つ行がいくつあるかを判断し、それらのパーセンテージ(たとえば、75%削減した場合は総数の4分の1)をランダムに選択して追加します。結果を保持する新しいファイル。残りのキーを引き続き調べ、ランダム化してから、各一意のキーを含むすべての行を同じ割合で減らします。削減ができない場合は、すべての行を結果のファイルに引き継ぐだけです。

私が言ったように、私のbashスクリプトは非常にうまく機能しますが、それは遅く、さまざまなawkおよびgrepコンストラクトをつなぎ合わせます。すべてのアカウントで、Pythonはこれをはるかに洗練された方法で、メモリをあまり損なうことなく処理する必要があります(この場合も、5,000万行以上のファイルを処理しています)。どんな提案/トリックも役に立ちます!ありがとう!

0 投票する
1 に答える
274 参照

pca - 顔認識のPCA

x1 を image1 のベクトル (灰色)、x2 を image2 のベクトル (灰色) とする。xn を imagen のベクトル (灰色) とする。たとえば、すべての画像サイズは r 行 c 列 (r*c) で表されます。

したがって、X = [x1, x2, x3, .... xn].

多くの文献が示唆しているように、n を減らすには。他の文献も r*c を減らすことを好みます。

どちらを好むか。

0 投票する
1 に答える
1408 参照

c++ - Noob C++/OpenMP: このコンパイル時エラーが発生するのはなぜですか? 「reduction」句の変数は、囲んでいるコンテキストで共有する必要があります

なぜこのエラーが発生するのですか?

(3) エラー C3037: 'result': 'reduction' 句の変数は、囲んでいるコンテキストで共有する必要があります

私はグーグルで試してみました...すべての例は次のようになります。それが重要な場合は、ビジュアルスタジオ2012でもこれをコーディングしています。私はこのような質問をするのは嫌いですが、続けるのを妨げています。

修正: 並列を追加

#pragma omp parallel for private(buffer) reduction(+:result)