質問

Microsoftは、VM実行時またはコンパイル時にF#プログラムを作成して、プログラムが関数型言語でビルドされたことを検出し、自動的に並列化できるようにすることは可能ですか?

現在、シングルスレッドプログラムとしてビルドされたプログラムをマルチスレッドプログラムとして自動的に実行しようとするような努力はないと思います。

つまり、開発者はシングルスレッドプログラムをコーディングします。コンパイラーは、必要に応じてmutexと同期を備えたマルチスレッドのコンパイル済みプログラムを吐き出します。

これらの最適化は、プロセススレッドカウントでタスクマネージャーに表示されますか、それよりも低いレベルになりますか?

役に立ちましたか?

解決

これは近い将来に起こりそうもないと思います。そして、それが起こった場合、言語レベル(たとえば、F#/コンパイラに固有の何か)よりもILレベル(アセンブリの書き換え)のほうが可能性が高いと思います。これは興味深い質問であり、一部の優秀な人はこれを見ており、しばらくはこれを引き続き見続けると思いますが、近い将来、人間がより簡単に指示できるようになることに焦点が置かれると思いますまるで魔法のようにすべてを行うのではなく、プログラムのスレッド化/並列化。

F#asyncのような言語機能ワークフロー、およびタスク並列ライブラリなどなどのライブラリが適していますここでの短期的な進歩の例、特にプログラムが命令よりも宣言的である場合、彼らはあなたのためにほとんどの重荷を持ち上げることができますが、それでもプログラマはオプトインする必要があり、正確性/意味性の分析を行い、おそらくコードの構造にわずかな変更を加えて、すべて機能するようにします。)

とにかく、それはすべて推測です。誰が未来がもたらすものを言うことができますか?私はそれを見つけることを楽しみにしています(そして、できればそれを実現することを望みます)。 :)

他のヒント

F#はOcamlおよびOcamlコンパイラーから派生したものであるため、他のコンパイラーよりもはるかに優れたプログラムを最適化できます。

一般的に便利な方法でコードを自動ベクトル化することは不可能だと思います。F#の関数型プログラミングファセットは、このコンテキストでは本質的に無関係です。

最も難しい問題は、サブ計算を並行して実行できるタイミングを検出しないこと、つまり、パフォーマンスが低下しない場合、つまり、サブタスクが計算に十分な時間をかけて並列スポーンのパフォーマンスヒットを取る価値がある場合を判断することです。

これを科学コンピューティングのコンテキストで詳細に調査し、F#for Numericsライブラリでハイブリッドアプローチを採用しました。 MicrosoftのTask Parallel Library上に構築された並列アルゴリズムには、サブタスクの計算の複雑さを推定する関数である追加のパラメーターが必要です。これにより、実装で過度の細分化を回避し、最適なパフォーマンスを確保できます。さらに、このソリューションは、複雑さを記述する関数パラメーターが通常匿名のファーストクラス関数であるため、F#プログラミング言語に最適です。

乾杯、 ジョンハロップ。

質問は.NETアーキテクチャのポイントを見逃していると思います-F#、C#、VB(など)はすべてILにコンパイルされ、JITコンパイラを介してマシンコードにコンパイルされます。プログラムが関数型言語で記述されているという事実は関係ありません。ILからJITコンパイラーに最適化(末尾再帰など)が利用できる場合、コンパイラーはそれを利用する必要があります。

当然、これは、機能コードの記述が無関係であることを意味するものではありません-明らかに、より並列化するILを記述する方法があります-これらの手法の多くは、.NET言語で使用できます。

したがって、潜在的な並列性を調べるためにF#からのILとしてフラグを立てる必要はありませんし、そのようなことが望ましいこともありません。

さまざまな言語の自動並列化と自動ベクトル化に関する活発な研究があります。そして、「私は本当にF#が好きだから」「純粋」が副作用のないサブセットが使用され、それを並列化します。 また、Haskellの父親であるSimon Peyton-JonesがMicrosoftで働いているので、すばらしいものがやってくるとは信じられません。

可能ですが、可能性は低いです。マイクロソフトは、ほとんどの時間を、最大のクライアントが要求する機能のサポートと実装に費やしています。通常は、C#、VB.Net、およびC ++を意味します(必ずしもこの順序である必要はありません)。 F#は優先順位のリストで高いようには見えません。

Microsoftは現在、コードの並列化のための2つの手段を開発しています。PLINQ(Parallllel Linq、機能言語に負うところが大きい)と、元々Robotics Studioの一部であったTask Parallel Library(TPL)です。 PLINQのベータ版はこちら

.NETコードの自動並列化の標準となるPLINQにお金を注ぎます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top