問題タブ [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.
arrays - 単精度配列の deepSeqArray
Float
関数によって作成された要素のベクトルがありgetVectorFloat
ます。いくつかの測定を行うには、 を使用する必要がありますdeepSeqArray
。しかし、私はそれを行うことができません。
これが私の例です:
そして、私が得るエラー:
Array sh0 a0
に一致しない理由がわかりませんArray Dim1 Float
。
ご協力ありがとうございました
arrays - Repa を使用した「2 次元配列のループ」の最良の方法
Haskell 用の配列ライブラリ Repa は非常に興味深いものであり、簡単なプログラムを作成して、その使用方法を理解しようとしました。また、リストを使用して簡単な実装を作成しましたが、これははるかに高速であることが証明されました。私の主な質問は、以下の Repa コードをどのように改善して最も効率的なものにするか (そしてできれば非常に読みやすいものにすること) です。私はHaskellを使用するのはまったく初めてで、Repaに関する簡単に理解できるチュートリアルを見つけることができませんでした.[ Haskell Wikiにあるものを編集してください. :) たとえば、force または deepSeqArray をいつ使用するかがわかりません。
このプログラムは、次の方法で球体の体積を概算するために使用されます。
- 球体の中心点と半径、および球体を取り囲むことが知られている立方体内の等間隔の座標が指定されます。
- プログラムは各座標を取得し、球の中心までの距離を計算し、それが球の半径よりも小さい場合は、球の合計 (概算) 体積を加算するために使用されます。
リストを使用するバージョンと repa を使用するバージョンの 2 つのバージョンを以下に示します。特にこのユースケースでは、コードが非効率的であることはわかっていますが、後でもっと複雑にするという考えです。
以下の値の場合、"ghc -Odph -fllvm -fforce-recomp -rtsopts -threaded" でコンパイルすると、リスト バージョンは 1.4 秒、repa バージョンは +RTS -N1 で 12 秒、+RTS - で 10 秒かかります。 N2、ただし火花は変換されません (Windows 7 64、GHC 7.0.2、および llvm 2.8 を実行するデュアルコア Intel マシン (Core 2 Duo E7400 @ 2.8 GHz) を使用しています)。(以下のメインの正しい行をコメントアウトして、バージョンの 1 つだけを実行してください。)
助けてくれてありがとう!
編集:上記のようにコードを書いた理由を説明する背景:
私は主に Matlab でコードを書いており、パフォーマンス向上の経験は主にその分野から来ています。Matlab では、通常、行列を直接操作する関数を使用して計算を行い、パフォーマンスを向上させます。上記の問題を Matlab R2010b で実装すると、以下に示すマトリックス バージョンを使用すると 0.9 秒かかり、ネストされたループを使用すると 15 秒かかります。Haskell が Matlab と大きく異なることは知っていますが、Haskell でリストの使用から Repa 配列の使用に移行することで、コードのパフォーマンスが向上することを願っていました。リストからの変換 -> Repa 配列 -> ベクトルがあるのは、それらをより良いものに置き換えるのに十分なスキルがないためです。これが私が入力を求める理由です。:) したがって、上記のタイミングの数値は主観的なものです。パフォーマンスは、言語の能力よりも優れていますが、何を使用するかを決定するのは、それを機能させることができるかどうかに依存するため、現在の私にとって有効な指標です.
tl;dr: 上記の Repa コードがばかげているか病的である可能性があることは理解していますが、それが今できる最善のことです。私はより良い Haskell コードを書けるようになりたいと思っています。あなたがその方向で私を助けてくれることを願っています (dons は既に行っています)。:)
編集 2 : Repa コードの新しい、より高速でシンプルなバージョン
Repaについてもう少し読んで、少し考えました。以下は、新しい Repa バージョンです。この場合、Repa 拡張関数を使用して、値のリストから x、y、および z 座標を 3 次元配列として作成します (Matlab での ndgrid の動作と同様)。次に、これらの配列をマッピングして、球状粒子までの距離を計算します。最後に、結果として得られた 3 次元距離配列を折り畳み、球内にある座標の数を数え、定数係数を掛けて、おおよその体積を取得します。私のアルゴリズムの実装は、上記の Matlab バージョンに非常に似たものになり、ベクトルへの変換はなくなりました。
新しいバージョンは、私のコンピューターで約 5 秒で実行され、上記から大幅に改善されています。コンパイル中に「スレッド化」を使用し、「+RTS -N2」と組み合わせて使用してもしなくても、タイミングは同じですが、スレッド化バージョンではコンピューターの両方のコアが最大になります。ただし、「-N2」の数滴が 3.1 秒まで実行されるのを見ましたが、後で再現できませんでした。同時に実行されている他のプロセスに非常に敏感なのでしょうか? ベンチマーク時にコンピューターのほとんどのプログラムを終了しましたが、バックグラウンド プロセスなど、まだいくつかのプログラムが実行されています。
「-N2」を使用し、ランタイム スイッチを追加して並列 GC (-qg) をオフにすると、時間は一貫して ~4.1 秒に短縮され、-qa を使用して「OS を使用してスレッド アフィニティを設定する (実験的)」、時間は約 3.5 秒まで短縮されました。「+RTS -s」を使用してプログラムを実行した結果の出力を見ると、-qg を使用して実行される GC ははるかに少なくなります。
今日の午後、楽しみのために、8 コアのコンピューターでコードを実行できるかどうかを確認します。:)
新しいコードのスペース プロファイリング
Don Stewart が作成したのと同じタイプのプロファイルですが、新しい Repa コード用です。
arrays - 範囲を超えて Repa で配列スライスを取得する方法
積分画像を計算するために、Repa を使用して累積合計関数を実装しようとしています。私の現在の実装は次のようになります。
問題は elementSlice 関数にあります。matlab または numpy では、これは array[inner,0:outer] として指定できます。だから私が探しているのは、次のようなものです:
ただ、現在 Repa ではスライスを範囲指定することはできないようです。Haskell での効率的な並列ステンシル畳み込みで説明されているように、パーティションの使用を検討しましたが、反復ごとに変更される場合、これはかなり重量級のアプローチのように思えます。また、スライスをマスキングすることも検討しました (バイナリ ベクトルを乗算する) - しかし、行列内のすべての点にマスク ベクトルを割り当てるため、大きな行列ではパフォーマンスが非常に悪いように思えました...
私の質問 - Repa に範囲でのスライスのサポートを追加する計画があるかどうか誰か知っていますか? または、おそらく別のアプローチで、この問題にすでに対処できるパフォーマンスの高い方法はありますか?
arrays - HaskellRepa---選択機能は少し紛らわしいです
repaパッケージのselect関数と少し混乱しています:
結果を出します
私は0から10または0から9の間にいると思いました。なぜ0から8の間にあるのですか?
repa 2.0.2.1
arrays - Haskell repa --- インデックスによるマッピング
関数を配列にマップしたいとしますが、その関数の型は of だけでは
a -> b
なく、
a -> Int -> b
つまり、関数はインデックスもとります。それ、どうやったら出来るの?
haskell - Accelerate と Repa には異なるユースケースがありますか?
私は Repa と Accelerate で遊んでいます。どちらも興味深いものですが、どちらをいつ使用し、いつもう一方を使用するかはわかりません。彼らは一緒に成長していますか、ライバルですか、それとも単に異なる問題のために成長していますか?
haskell - Repa での転置と累積合計のパフォーマンスの低下
Haskell ライブラリ Repa で以下に定義する累積合計関数を開発しました。ただし、この関数を転置操作と組み合わせるときに問題が発生しました。次の 3 つの操作はすべて 1 秒未満で完了します。
ただし、次のように記述します。
パフォーマンスが著しく低下します。1920x1080 の画像では、個々の操作は 1 秒未満で完了しますが、組み合わせると 30 秒以上かかります...
これを引き起こしている可能性のあるアイデアはありますか?私の腸は、それが遅延配列に関係していること、適切なタイミングで強制していないことなどに関係していると私に言っています...しかし、私はこれをまだ追跡するのに十分な経験がありません.
haskell - Repaでの本質的にシーケンシャルな配列変換
repaに(//)の類似物があるのだろうか?
並列化できない配列変換に必要です。たとえば、関数が配列全体で配列の1つのエントリを変更する必要があり、それが新しい配列に適用される場合など(そして、順次実行する必要があります)。
haskell - ネストされた配列定義を修復すると、「ネストされた並列計算を順次実行しています...」
より大きな問題の一部として、次のように配列内で配列を定義しようとしています。
extract
関数は使用されfromFunction
ており、ルックアップ関数が提供されていますが、同じ効果のためにtraverse
andを使用することもできます。andをできるだけ早くarr ! ...
使用したにもかかわらず、コンソールには次のメッセージが表示され、その後に正しい結果が表示されます。force
deepSeqArray
Data.Array.Repa: ネストされた並列計算を順次実行します。別のインスタンスが既に実行されているときに、おそらく「強制」関数を呼び出しました。これは、遅延評価のために 2 番目のバージョンが中断された場合に発生する可能性があります。「deepSeqArray」を使用して、次の配列を「強制」する前に各配列が完全に評価されるようにします。
速度を比較するためのリストを含むバージョンを構築していませんが、より大きなバージョンではパフォーマンスが低下しています。
これは単にネストされた配列定義の結果なので、内部定義または外部定義のいずれかがリストになるようにプログラムを再構築する必要がありますか? 私のextract
機能はひどいものであり、問題の原因ですか?
この質問 からのヒントは、ここまで到達するのに役立ちましたが、コンパイルされたコードをまだクロールしていません。