14

Microsoft は、VM の実行時、またはおそらくコンパイル時に、プログラムが関数型言語で構築されたことを検出し、自動的にそれをより適切に並列化できるように F# プログラムを作成できるようになる可能性はありますか?

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

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

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

4

7 に答える 7

12

近い将来、これはありそうもないことだと思います。そして、それが起こるとすれば、言語レベル (F#/コンパイラに固有のものなど) ではなく、IL レベル (アセンブリの書き換え) で発生する可能性が高いと思います。これは興味深い質問であり、一部の優れた頭脳がこれを検討しており、しばらくの間これを検討し続けると予想していますが、短期的には、人間がより簡単に指示できるようにすることに焦点が当てられると思います。魔法のようにすべてを実行するのではなく、プログラムのスレッド化/並列化。

( F# 非同期ワークフローなどの言語機能や、タスク並列ライブラリなどのライブラリは、ここでの短期的な進歩の良い例です。これらは、特にプログラムが命令型よりも宣言型である場合に、ほとんどの面倒な作業を行うことができます。ただし、プログラマーがオプトインし、正確性/意味を分析し、おそらくコードの構造をわずかに変更してすべてを機能させる必要があります.)

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

于 2008-09-27T15:05:00.997 に答える
7

F# は Ocaml から派生したものであり、Ocaml コンパイラは他のコンパイラよりもはるかに優れたプログラムの最適化を行うことができるため、おそらく実行できるでしょう。

于 2008-09-27T14:46:27.703 に答える
6

一般的に有用な方法でコードを自動ベクトル化することが可能であるとは思えず、F# の関数型プログラミングの側面は、このコンテキストでは本質的に無関係です。

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

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

乾杯、ジョン・ハロップ。

于 2008-10-19T03:46:31.297 に答える
4

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

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

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

于 2008-09-27T15:36:22.187 に答える
3

さまざまな言語の自動並列化と自動ベクトル化に関する研究が活発に行われています。そして、(私は F# が本当に好きなので) 「純粋な」副作用のないサブセットが使用されているかどうかを判断し、それを並列化する方法を考案することを期待できます。また、Haskell の父である Simon Peyton-Jones が Microsoft で働いているので、素晴らしいものがやってくると信じずにはいられません。

于 2008-09-27T14:47:58.947 に答える
2

Microsoftは現在、コードの並列化のために2つの方法を開発しています。PLINQ(関数型言語に多くを負っているPararllel Linq)と、元々RoboticsStudioの一部であったTaskParallel Library(TPL)です。PLINQのベータ版はこちらから入手できます。

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

于 2008-10-19T04:31:37.710 に答える
2

それは可能ですが、ありそうにありません。Microsoftは、ほとんどの時間を最大のクライアントから要求された機能のサポートと実装に費やしています。これは通常、C#、VB.Net、およびC ++を意味します(必ずしもこの順序である必要はありません)。F#は、優先順位のリストの上位にはないようです。

于 2008-09-27T15:52:45.720 に答える