問題タブ [repa]
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.
haskell - Repa --- Readインスタンスを作成する方法は?
作るための最良の方法は何ですか
読み取りのインスタンス?だから後で私は導き出すことができた
Readのインスタンスにもなります。
haskell - 並列化なしの Repa
Repa
同時実行機能に関係なく、私は のインターフェースが本当に好きです。私の配列は比較的小さいものであり、それらの並列化は役に立たず、有害でさえあるためです。
ただし、parallel-io を使用してプログラムで並列化を使用しているため、コンパイルし-threaded
て実行し+RTS -Nx
ます。これにより、repa の並列化が可能になります。repa の同時実行機能をオフにする方法はありますか?
うーん、これを書いているうちに、それ以外のものが必要になる可能性は低いことがわかったDIM1
ので、 に切り替える必要があるかもしれませんVector
。それにもかかわらず、質問への答えは役に立ちます。
並列実行で表示される警告メッセージは
私は実際にはforce
私のコードにはありません。
arrays - Haskell: Repa ライブラリでは ... リストは Elt ではありませんが、「k-tuples」はどうでしょうか。
サイズ k の 2 次元行列を n+1 (たとえば) 走査し、配列の各要素が要素のリストであるアルゴリズムを書きたいと思います。これらのリストのサイズはさまざまで、長さは 1、2、...、k です。確かに、最初の行ではすべて長さ 1、2 番目の行では長さ 2、...、k 番目の行では長さ k になるとさえ言えます。Haskell には「k-タプル」のための何らかのメカニズムがあると思いますが、それが何であるかはわかりません。型が何らかの固定サイズでインデックス付けされていたとしても、それは問題ありません。パフォーマンスがわずかに低下することを意味しますが、それほど悪くはありません。
助言がありますか?
performance - レパ3の性能と「今」の正しい使い方
ここには、Repa とは関係のない基本的なモナドの質問と、いくつかの Repa 固有の質問があります。
Repa3 を使用してライブラリに取り組んでいます。効率的な並列コードの取得に問題があります。関数が遅延配列を返すようにすると、コードが非常に遅くなり、最大 8 コアまで拡張できます。このコードは、GHC プロファイラーごとに 20GB を超えるメモリを使用し、基本的な Haskell のボックス化されていないベクトルよりも数桁遅く実行されます。
あるいは、すべての関数がボックス化されていないマニフェスト配列を返すようにすると (たとえば、「マップ」を実行するときなど、関数内でまだ融合を使用しようとしている)、はるかに高速なコード (Haskell のボックス化されていないベクトルを使用するよりもまだ遅い) が得られます。まったく拡張できず、実際、コアが増えるとわずかに遅くなる傾向があります。
Repa-Algorithms の FFT サンプル コードに基づくと、正しいアプローチは常にマニフェスト配列を返すことです。遅延配列を返す必要がある場合はありますか?
FFT コードでは、'now' 関数も多用されています。ただし、コードで使用しようとすると、型エラーが発生します。
コードは「今」なしで正常にコンパイルされます。「今」では、次のエラーが発生します。
タイプ Array U (Z :. Int) と一致しませんでした
r' with
r' `r' は fromArray :: (BaseRing mr, Unbox r, Repr tr) => Arr tr -> CycRingRepa mr の型シグネチャによってバインドされた固定型変数ですC:\Users\crockeea\Documents\Code\LatticeLib\CycRingRepa.hs:50:1 で期待される型: CycRingRepa mr 実際の型: CycRingRepa m (配列 U DIM1 r)
これは私の問題ではないと思います。 モナドが「今」どのように機能するかを誰かが説明できれば助かります。私の最善の推定では、モナドは「Arr U (Arr U r)」を作成しているようです。「Arr U r」を期待していますが、これはデータ コンストラクターのパターンと一致します。何が起こっていて、どうすれば修正できますか?
型シグネチャは次のとおりです。
「今」を使用するのが適切な場合について、より良い考えを持っていると役に立ちます。
その他の Repa に関する質問: (FFT サンプル コードのように) computeUnboxedP を明示的に呼び出す必要がありますか、それともより一般的な computeP を使用する必要がありますか (アンボックス部分がデータ型によって推測されるため)。遅延配列またはマニフェスト配列をデータ型 CycRingRepa に格納する必要がありますか? 最終的には、このコードが Haskell Integers でも動作するようにしたいと考えています。これには、U 配列以外のものを使用する新しいコードを作成する必要がありますか? または、unbox 型の U 配列と Integers/boxed 型の他の配列を作成するポリモーフィック コードを作成できますか?
ここには多くの質問があることを認識しています。すべての回答に感謝します。
haskell - GHC で SpecConstr を支援するにはどうすればよいですか?
GHC 7.4.1 を使用して、Repa を使用するプログラムをコンパイルしようとしています。しかし、コンパイルの途中で、メモリが不足しています。ではghc -v
、SpecConstr フェーズでスタックしていることがわかります。
SpecConstr は、GHC の Core-to-Core 変換の 1 つです。サイモン・ペイトン・ジョーンズはここに素晴らしい説明をしており、ここにいくつかのコードがありますが、私はGHCの内部の仕組みにあまり慣れていないので、かなり時間がかかります.
どうにかしてコンパイラを助けたいのですが、どこで動かなくなっているかを知る方法はありますか? または、より大きなマシンで再コンパイルできるようになるまで、この段階でメモリ使用量を制限する方法はありますか?
ありがとう、チャド
haskell - Repa2と3のAPIの主な違いは何ですか?
具体的には、次のような無害に見える小さなRepa3プログラムがあります。
2Ghzコア2デュオラップトップで640x420の画像を処理するには、これだけの時間がかかります。
Repa 2を使用して、はるかに複雑なアルゴリズムでパフォーマンスが大幅に向上したため、何かがかなり間違っているに違いないことを知っています。そのAPIの下で、すべての配列変換の前に「force」への呼び出しを追加することで、大きな改善が見られました(これは理解しています)マップ、畳み込み、トラバースなどへのすべての呼び出しを意味します)。Repa 3で行う類似のことを完全に理解することはできません。実際、新しいマニフェストタイプのパラメーターは、配列を強制する必要がある場合にあいまいさがないことを保証することになっていると思いましたか?そして、新しいモナディックインターフェイスはこのスキームにどのように適合しますか?Don Sによるすばらしいチュートリアルを読みましたが、Repa2と3のAPIの間には、オンラインAFAIKではほとんど議論されていないいくつかの重要なギャップがあります。
もっと簡単に言えば、上記のプログラムの効率を修正するための最小限の影響を与える方法はありますか?
haskell - Repa で a[i] = f(a[i-1]) をどのように計算しますか?
Repa で、過去の値 (つまり、より小さいインデックス) に依存する配列を計算することは可能ですか? 配列の最初の部分 (例: a[0]
) が与えられます。(配列の要素を示すために C に似た表記法を使用していることに注意してください。混同しないでください。)
チュートリアルを読んでハックをサクッと確認したのですが、それを行う機能が見つかりませんでした。
(この種の計算を 1D 配列で行うことは、Repa では並列化できないため意味がないと思います。ただし、2 次元以上の場合は並列化できると思います。)
編集f
:おそらく、私が使用したい種類についてより具体的にする必要があります。がスカラーの場合は並列化する方法がないため、N 次元ベクトルa[i]
の場合に注目しましょう。ベクトルに「展開」できるため、高次元 (行列など) であるa[i]
必要はありません。a[i]
つまり、f
R^N を R^N にマップする関数です。
ほとんどの場合、次のようになります。
ここb
で、 は N 次元ベクトル、M
は N 行 N 列の行列 (まばらであることを前提としない)、およびg
は何らかの非線形関数です。i=1,..N-1
そして、与えられたa[0]
、g
およびに対してそれを計算したいと思いM
ます。(1)このタイプの計算を並列化し、(2)効率的な中間変数の割り当てを行うための一般的な方法があることを願っていb
ます(Cのような言語では、再利用できます。Repaまたは同様のライブラリは、純度を損なうことなく魔法のようにそれを行うことができます)。
arrays - Repa 配列の並列 mapM
最近のでの作業では、乱数生成にほぼ理想的なインターフェイスを提供するGibbs sampling
を大いに活用してきました。RVar
悲しいことに、マップでモナド アクションを使用できないため、私は Repa を利用できませんでした。
明らかにモナド マップは一般に並列化できませんが、効果を安全に並列化できるモナドの少なくとも 1 つの例であると思われますRVar
(少なくとも原理的には、私は の内部動作にあまり詳しくありませんRVar
) 。 . つまり、次のようなものを書きたいのですが、
どこA.mapM
がどのように見えるか、
これがどのように機能するかは、RVar
とその基礎となるの実装に決定的に依存することは明らかですRandomSource
が、原則として、生成されたスレッドごとに新しいランダム シードを描画し、通常どおり処理を進める必要があると考えられます。
直観的には、これと同じ考え方が他のモナドにも一般化されているように見えます。
だから、私の質問は次のとおりですParallelMonad
。エフェクトを安全に並列化できるモナドのクラスを構築できますか (おそらく、少なくとも が存在しRVar
ます)。
それはどのように見えるでしょうか?このクラスには他にどのようなモナドが存在する可能性がありますか? 他の人は、これが Repa でどのように機能するかの可能性を検討しましたか?
最後に、並列モナド アクションのこの概念を一般化できない場合、特定のケースRVar
(非常に便利な場合) でこれを機能させる良い方法を誰かが見つけますか? 並列処理をあきらめることRVar
は、非常に難しいトレードオフです。
haskell - repa-algorithms関数で観察された予期しないパフォーマンス
mmultP
私は次のコードで関数をテストしていましたrepa-algorithms-3.2.1.1
(簡潔にするためにここに少し要約します):
ここで指定されているように、
スレッドランタイムでの順次実行は次のとおりです。
これが4コアを使用したものです(4コアMacBook Airで実行):
ここで何が起こっているのか、誰か直感がありますか?-N2
また、とのパフォーマンスが順次より遅くなり-N3
ます。各コアは、さらに時間を追加するようです。
手巻きのRepa行列乗算コードでは、並列処理によるわずかな向上が見られることに注意してください。
更新:
不可解; に置き換えmain
ました
との依存関係を削除しましたmwc-random
:
ランタイムオプションを使用したCriterionベンチマークでは、次の-N1 -K100M
結果が得られます。
そして-N4 -K100M
私に与える:
これは素敵なスピードアップです。以前の動作は、結果の1000x1000配列をstdoutに書き込んだことによるものだとほぼ思いますが、前述したように、独自の行列乗算コードを交換すると、並列処理の向上が見られます。まだ頭をかいて。
haskell - Haskellの型族の戻り型を指定する柔軟な方法はありますか?
最近、私はHaskellのRepaライブラリを使い始めました。これは、型族と関連する型に大きく依存しています。次のようにRepa配列を定義できます。
次のように操作します。
ここで、Uは、結果がボックス化されていない配列として表されるようにする関連データ型です。DIM2は配列次元です。推測できたとしても、具体的な寸法を指定しなければならないのは好きではありません。代わりに、次のようなものを書きたいと思います。
これは有効ではありませんが、適切な関連データ型(この例ではU)を渡すことで配列型を指定できるようにすることを目的としていますが、形状は変更しません。そのようなことは可能ですか?