F#の並列ソートアルゴリズムは実装が簡単

F#の並列ソートアルゴリズムは実装が簡単

F# の並列ソート アルゴリズムで最も一般的な方法の 1 つは、まず処理するデータを複数の部分に分割し、次に異なるスレッド (CPU) で処理することです。すべてのスレッドが処理を完了すると、結果が集められ、独立したスレッドでマージされて最終結果が形成されます。分割する場合、各スレッドが独自の独立したデータのみにアクセスし、グローバル データや他のスレッドのデータ (ここでのデータは読み取り専用ではないデータを指します) にアクセスしないようにします。結果をマージする場合は、効率的なアルゴリズムを使用してマージする必要があります。

ソートアルゴリズムには、マージソートアルゴリズムがあります。まず、多方向マージソートアルゴリズムを記述し、ソートする配列をCPUの数に分割し、各CPUに各部分をソートさせ、すべてのスレッドがソートを完了したら、それらをまとめて独立したスレッドでマージソートを実行します。

もう一度コードを説明します。F# に馴染みのない方もいるかもしれません。

1. マージ アルゴリズムの考え方は、各スコア グループの最小の添字から始めて、複数のソート済み配列を 1 つの大きなソート済み配列にマージすることです。最小のものを大きな配列に入れ、次にこの配列の添字を 1 つ増やしてから再度比較し、最小のものを大きな配列に入れ、すべての小さな配列の添字が末尾を指すまでこれを繰り返します。一時変数 min が使用されるため、 mutable キーワードで変更されます。

2. F# 配列の長さは、Array.length メソッドを使用して取得されます。変数と配列の代入記号は、= ではなく <- です。= は C# の == に相当します。F# には、continue や break などのキーワードはありません。

3. async キーワードは新しい並列プリミティブです。これによって展開されたコードは、f# によってスレッド プール内で自動的に非同期実行されます。結果を返す場合は、let! キーワードと return! キーワードを使用する必要があります。ソートは配列に対してのみ実行され、何も返さないため、ここでは比較的単純です。

4. (fun ab -> a - b) はラムダ式であり、自動的にComparerに変換できます。 、ソートの基準となる

5. Array.map は、配列内の各要素にメソッドを適用することを意味します。この時点では実行されませんが、パイプラインを介して Async.Parallel メソッドに渡されます。Async.Parallel メソッドは、非同期実行配列 Async<'a array> を返し、最後に Async.Run を使用して、Async.Parallel によって返された結果を実際に実行します。

6. |> はパイプラインを意味し、前の関数の結果が次の関数で使用されることを意味します。このように、1 つのステートメントで非常に一貫したロジックを表現できます。

F# 並列ソート アルゴリズムの全体的なコードは次のとおりです。

 1 #ライト
2
3 オープンシステム
4 System.Diagnosticsを開く
5 Microsoft.FSharp.Control.CommonExtensions を開く
6
7 let merge_sort destArray ソース cmp =
8 N = Array.length ソースとする
9 L = Array.length destArray - 1 とします
10 posArr = Array.create N 0 とします
11 i = 0からLまで
12 変更可能な最小値を -1 にする
13 j = 0からN - 1まで
14 posArr.[j] >= Array.length source.[j] の場合 ()
15 その他
16 min = -1 の場合、min <- j
17 その他
18 (cmp source.[j].[posArr.[j]] source.[min].[posArr.[min]]) < 0 の場合、min <- j
19 min = -1 の場合 ()
その他20
21 destArray.[i] <- source.[min].[posArr.[min]]
22 位置[分] <- 位置[分] + 1
23
24 並列ソートをcmp arr =にする
25 プロセッサカウントを Environment.ProcessorCount とします。
26 partArray = Array.create プロセッサカウント [||]
27 可変長のまま = Array.length arr
28 partLen = Array.length arr / プロセッサカウント
29
30 i = 0 からprocessorCount - 1 まで
31 i = プロセッサカウント - 1 の場合
32 temp_arr = Array.create を 0 のままにする
33 Array.Copy(arr, i*partLen, temp_arr, 0, 残り)
34 部分配列.[i] <- temp_arr
35 その他
36 temp_arr = Array.create partLen 0 とする
37 Array.Copy(arr, i*partLen, temp_arr, 0, partLen)
38 残り <- 残り - partLen
39 部分配列.[i] <- temp_arr
40
41 let a_sort_one arr =
42 非同期 {
43 配列.sort cmp arr
44 }
45
46 a_sort_all = とします
47 部分配列
48 |> Array.map (fun f -> a_sort_one f)
49 |> 非同期並列
50 |> 非同期実行
51
52 すべて並べ替え
53 ret = Array.create (Array.length arr) 0 を実行します。
54 merge_sort ret partArray (fun ab -> a - b)
55 ret
56
57 arr = Array.create 1000000 0 とします
58 rnd = new Random() とします
59 i = 0 から Array.length arr - 1 まで
60 arr.[i] <- rnd.Next()
61
62 stop = Stopwatch.StartNew() を実行します。
63 停止、開始
64 sorted_arr = parallel_sort (fun ab -> ab) arr とします
65 停止。停止
66 printfn "並列ソート結果\r\n=%A\r\n所要時間 %d ミリ秒" sorted_arr stop.ElapsedMilliseconds
67
68 stop2 = Stopwatch.StartNew() とします
69 Array.sort (fun ab -> ab) arr
70 停止。停止
71 printfn "シリアルソート結果\r\n=%A\r\n所要時間 %d ミリ秒" arr stop2.ElapsedMilliseconds
72
73 コンソール.ReadKey(true)

私の IBM X200 では、シリアル ソートには約 1200 秒、パラレル ソートには約 900 秒かかります。

F# 並列ソートアルゴリズム関連リンク:

シンプルな F# 式から並行アプリケーションを構築する

マイクロソフト

Visual Studio 2010 に F# が正式に追加される

http://developer..com/art/200812/103775.htm

この記事は、 Prince Frogブログ記事「 Frog の推奨事項: F# が並列ソート アルゴリズムを実装」から引用したものです。

<<:  C# 暗号化アルゴリズムの簡単な紹介

>>:  C# モザイク アルゴリズムの実装

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

5年後に最もホットなものは何でしょうか? 2025 年のトップ 10 トレンド: ゼロ検索時代の到来

[[273076]]ファーウェイは8月8日、世界産業展望GIV@2025を発表し、次のように予測した...

AIが再び大学入試小論文に挑戦、強力なハードコア技術で「数秒」の文章作成を実現

昨日(6月7日)、2022年度全国大学入学試験が始まりました。午前中に中国語科目試験が終了し、中国語...

画期的なニューラルネットワークが量子AI研究への道を開く可能性

海外メディアの報道によると、イタリアの研究者らは最近、量子コンピュータ上で特殊なアルゴリズムを実行す...

2021 年の人工知能と自動化のトレンド

[[430280]]特にリモートワークの増加と労働力不足により従来の労働パターンが変化する中、多くの...

PaddlePaddle をベースに構築された産業グレードの ICNET アプリケーションの予測速度は、TensorFlow を 20% 上回ります。

導入ICNET について話すとき、リアルタイム アプリケーションにおける画像セマンティック セグメン...

WSLはAIトレーニングタスクとLinux GUIアプリケーションの実行をサポートします

WSL は Windows 上で GPU を使用してアプリケーションを実行することをサポートするよう...

6つの新しいことに焦点を当て、新境地を開拓し、プロジェクトは変革を促進するための王様です。2020年中国(太原)人工知能会議が開催されました

2002年から2012年までの石炭の「黄金の10年」を経験した後、「古い工業基地」である山西省太原市...

CMU、清華大学、MITが世界初のエージェント無限フローをリリース。ロボット「007」は残業して勉強が止まらない!具現化された知能は革命を起こしている

世界初の生成型ロボットエージェントがリリースされました!長い間、大規模なインターネットデータでトレー...

AI技術のダークサイド:犯罪者と人工知能の関係

[[248661]]ビッグデータダイジェスト制作編集者: DonFJ、Jiang Baoshang機...

ブロックチェーンは世界を変えつつありますが、人類はどこまで到達できるのでしょうか?

猫を飼うことで生じる混雑により、人々はブロックチェーンの力に驚嘆し始めました。数字で構成されたこの世...

人工知能時代のデータストレージの未来

2024 年は、テクノロジーとデータの状況に大きな変化が起こる年になると予想されています。生成 AI...

...

工業情報化部:全国の指定規模以上の産業用ロボット製造企業の営業収入は531.7億元

最近、工業情報化省の公式ウェブサイトは、2020年1月から12月までのロボット産業の稼働状況を発表し...

スマートシティ:都市生活にテクノロジーを統合する

この魅力的な旅をさらに深く探究する中で、モノのインターネット (IoT)、スマート交通システム、エネ...

データ分析 VS アルゴリズムモデル、どのように作業を分割し、効率的に連携するか?

[[438791]]この記事はWeChat公式アカウント「地道学院」から転載したもので、著者は地道...