{"id":120,"date":"2008-04-30T16:20:01","date_gmt":"2008-04-30T21:20:01","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=120"},"modified":"2008-04-30T16:20:01","modified_gmt":"2008-04-30T21:20:01","slug":"parallelization-in-f","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/","title":{"rendered":"Parallelization in F#"},"content":{"rendered":"<p>In my last post I was writing about parallelizing loops with Parallel.For in C#. Today I though it would be nice to try that in F#. So, here is the benchmarking of the matrix multiplication and the bubblesort algorithm in F4.<\/p>\n<h3>Matrices Multiplication<\/h3>\n<p>I started with a create_matrix function that creates and randomly initializes a matrix of doubles.<\/p>\n<pre class=\"prettyprint\">\r\nlet create_matrix rows columns =\r\n   let rnd = System.Random()\r\n   Array2.init rows columns (fun i j -&gt; rnd.NextDouble())\r\n<\/pre>\n<p>Sequential multiplication could look like this:<\/p>\n<pre class=\"prettyprint\">\r\nlet multiply_sequential (m1:float[,]) (m2:float[,]) =\r\n   let rows1 = Array2.length1 m1\r\n   let cols1 = Array2.length2 m1\r\n   let rows2 = Array2.length1 m2\r\n   let cols2 = Array2.length2 m2\r\n   let result = Array2.create rows1 cols2 0.0\r\n   \r\n   if(cols1 <> rows2) then \r\n      failwith \"Matrices size incorrect for multiplication!\"\r\n      \r\n   for i = 0 to rows1-1 do\r\n      for j = 0 to cols2-1 do\r\n         for k = 0 to cols1-1 do\r\n            result.[i,j] &lt;- result.[i,j] + m1.[i,k] * m2.[k,j]\r\n         done\r\n      done\r\n   done\r\n   result\r\n<\/pre>\n<p>Parallelizing it only implies replacing the outer loop with Parallel.For.<\/p>\n<pre class=\"prettyprint\">\r\nlet multiply_parallel (m1:float[,]) (m2:float[,]) =\r\n   let rows1 = Array2.length1 m1\r\n   let cols1 = Array2.length2 m1\r\n   let rows2 = Array2.length1 m2\r\n   let cols2 = Array2.length2 m2\r\n   let result = Array2.create rows1 cols2 0.0\r\n   \r\n   if(cols1 <> rows2) then \r\n      failwith \"Matrices size incorrect for multiplication!\"\r\n      \r\n   Parallel.For(0, rows1, (fun i-&gt;\r\n      for j = 0 to cols2-1 do\r\n         for k = 0 to cols1-1 do\r\n            result.[i,j] &lt;- result.[i,j] + m1.[i,k] * m2.[k,j]))\r\n   result\r\n<\/pre>\n<p>We can test those function and get the same output as I had in my previous post with this:<\/p>\n<pre class=\"prettyprint\">\r\nlet main() = \r\n   let step = 100\r\n   let size = ref step\r\n   while (!size &lt;= step*10) do\r\n      let m1 = create_matrix !size !size\r\n      let m2 = create_matrix !size !size\r\n      printfn \"Matrices size: %dx%d\" !size !size\r\n      \r\n      printf \"Sequential...\\t\"\r\n      let starts = DateTime.Now\r\n      let ms = multiply_sequential m1 m2\r\n      printfn \"%a\" output_any (DateTime.Now - starts)\r\n      \r\n      printf \"Parallel...\\t\"\r\n      let startp = DateTime.Now\r\n      let ms = multiply_parallel m1 m2\r\n      printfn \"%a\" output_any (DateTime.Now - startp)\r\n\r\n      size := !size + step    \r\n   done   \r\n   \r\nmain()\r\n<\/pre>\n<p>Before running, you have to make sure you add System.Threading.dll to the referred assemblies. And since this one depends on System.Core.dll, you also have to add this one. In you are using Visual Studio and a F# project, you can add the two references from the project properties.<\/p>\n<blockquote><p>-r c:\\Windows\\assembly\\GAC_MSIL\\System.Core\\3.5.0.0__b77a5c561934e089\\System.Core.dll -r &#8220;C:\\Program Files\\Microsoft Parallel Extensions Dec07 CTP\\System.Threading.dll&#8221;<\/p><\/blockquote>\n<p>The results are shown below:<\/p>\n<pre class=\"console\">\r\nMatrices size: 100x100\r\nSequential...   00:00:00.1250000\r\nParallel...     00:00:00.1250000\r\nMatrices size: 200x200\r\nSequential...   00:00:00.9218750\r\nParallel...     00:00:00.6093750\r\nMatrices size: 300x300\r\nSequential...   00:00:03.1093750\r\nParallel...     00:00:01.9375000\r\nMatrices size: 400x400\r\nSequential...   00:00:07.5000000\r\nParallel...     00:00:04.7343750\r\nMatrices size: 500x500\r\nSequential...   00:00:15.1562500\r\nParallel...     00:00:09.3125000\r\nMatrices size: 600x600\r\nSequential...   00:00:25.7031250\r\nParallel...     00:00:16.5312500\r\nMatrices size: 700x700\r\nSequential...   00:00:41.9843750\r\nParallel...     00:00:26.4375000\r\nMatrices size: 800x800\r\nSequential...   00:01:03.5781250\r\nParallel...     00:00:39.8281250\r\nMatrices size: 900x900\r\nSequential...   00:01:32.1093750\r\nParallel...     00:00:57.3125000\r\nMatrices size: 1000x1000\r\nSequential...   00:02:07.0468750\r\nParallel...     00:01:18.9687500\r\n<\/pre>\n<h3>Array Sorting<\/h3>\n<p>First, I created a function, create_array, that creates and randomly initializes an array of doubles.<\/p>\n<pre class=\"prettyprint\">\r\nlet create_array size = \r\n    let rnd = new Random()\r\n    let arr = Array.create size 0.0\r\n    for i = 0 to arr.Length-1 do\r\n        arr.(i) &lt;- rnd.NextDouble()\r\n    arr\r\n<\/pre>\n<p>The sequential bubblesort implementation is quite straight forward, of course.<\/p>\n<pre class=\"prettyprint\">\r\nlet bubblesort_seq (arr : double array) = \r\n    for i = 0 to arr.Length-1 do\r\n        for j = 0 to arr.Length-1 do\r\n            if (arr.(i).CompareTo(arr.(j)) &lt; 0) then\r\n                let temp = arr.(j)\r\n                arr.(j) &lt;- arr.(i)\r\n                arr.(i) &lt;- temp\r\n    arr\r\n<\/pre>\n<p>Parallelizing it, again, only means replacing the outer for loop with Parallel.For.<\/p>\n<pre class=\"prettyprint\">\r\nlet bubblesort_parallel (arr : double array) = \r\n    Parallel.For(0, arr.Length, (fun i -&gt; \r\n            for j = 0 to arr.Length-1 do\r\n                if (arr.(i).CompareTo(arr.(j)) &lt; 0) then\r\n                    let temp = arr.(j)\r\n                    arr.(j) &lt;- arr.(i)\r\n                    arr.(i) &lt;- temp))\r\n\r\n    arr\r\n<\/pre>\n<p>And this is how the two functions were used:<\/p>\n<pre class=\"prettyprint\">\r\nlet main()=\r\n    let step = 5000\r\n    let size = ref step\r\n    while (!size &lt;= step*10) do\r\n        let arr = create_array !size\r\n        printfn \"Array size: %d\" arr.Length\r\n        \r\n        printf \"Sequential...\\t\"\r\n        let starts = DateTime.Now\r\n        let arrs = bubblesort_seq arr\r\n        printfn \"%a\" output_any (DateTime.Now - starts)\r\n        \r\n        printf \"Parallel...\\t\"\r\n        let startp = DateTime.Now\r\n        let arrp = bubblesort_parallel arr\r\n        printfn \"%a\" output_any (DateTime.Now - startp)\r\n\r\n        size := !size + step\r\n    done\r\n    \r\nmain()\r\n<\/pre>\n<p>The output for the program is:<\/p>\n<pre class=\"console\">\r\nArray size: 5000\r\nSequential...   00:00:00.2343750\r\nParallel...     00:00:00.1562500\r\nArray size: 10000\r\nSequential...   00:00:00.8593750\r\nParallel...     00:00:00.5156250\r\nArray size: 15000\r\nSequential...   00:00:01.9531250\r\nParallel...     00:00:01.1718750\r\nArray size: 20000\r\nSequential...   00:00:03.3125000\r\nParallel...     00:00:02.1562500\r\nArray size: 25000\r\nSequential...   00:00:05.4062500\r\nParallel...     00:00:03.5312500\r\nArray size: 30000\r\nSequential...   00:00:07.4062500\r\nParallel...     00:00:05.0312500\r\nArray size: 35000\r\nSequential...   00:00:10.6562500\r\nParallel...     00:00:06.8906250\r\nArray size: 40000\r\nSequential...   00:00:13.2343750\r\nParallel...     00:00:08.9375000\r\nArray size: 45000\r\nSequential...   00:00:17.6406250\r\nParallel...     00:00:11.4687500\r\nArray size: 50000\r\nSequential...   00:00:20.8281250\r\nParallel...     00:00:14.2187500\r\n<\/pre>\n<p>If you compare the output with the one from C#, you&#8217;ll notice that the times are smaller. It looks like F# is faster than C#. Of course it can get faster if I replace the call to CompareTo() with operator &lt;.<\/p>\n<pre class=\"prettyprint\">\r\nif (arr.(i).CompareTo(arr.(j)) &lt; 0) then\r\n<\/pre>\n<pre class=\"prettyprint\">\r\nif (arr.(i) &lt; arr.(j)) then\r\n<\/pre>\n<p>In this case the results look like this:<\/p>\n<pre class=\"console\">\r\nArray size: 5000\r\nSequential...   00:00:00.1093750\r\nParallel...     00:00:00.1093750\r\nArray size: 10000\r\nSequential...   00:00:00.4843750\r\nParallel...     00:00:00.2343750\r\nArray size: 15000\r\nSequential...   00:00:01.1093750\r\nParallel...     00:00:00.4687500\r\nArray size: 20000\r\nSequential...   00:00:01.9062500\r\nParallel...     00:00:00.8437500\r\nArray size: 25000\r\nSequential...   00:00:03.0156250\r\nParallel...     00:00:01.2500000\r\nArray size: 30000\r\nSequential...   00:00:04.3437500\r\nParallel...     00:00:01.8906250\r\nArray size: 35000\r\nSequential...   00:00:05.9062500\r\nParallel...     00:00:02.4375000\r\nArray size: 40000\r\nSequential...   00:00:07.7656250\r\nParallel...     00:00:03.3593750\r\nArray size: 45000\r\nSequential...   00:00:09.8281250\r\nParallel...     00:00:04.0312500\r\nArray size: 50000\r\nSequential...   00:00:12.2031250\r\nParallel...     00:00:05.2343750\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>In my last post I was writing about parallelizing loops with Parallel.For in C#. Today I though it would be nice to try that in F#. So, here is the benchmarking of the matrix multiplication and the bubblesort algorithm in F4. Matrices Multiplication I started with a create_matrix function that creates and randomly initializes a &#8230; <a title=\"Parallelization in F#\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/\" aria-label=\"Read more about Parallelization in F#\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[37,42],"tags":[],"class_list":["post-120","post","type-post","status-publish","format-standard","hentry","category-fsharp","category-parallel-programming"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Parallelization in F#\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2008-04-30T21:20:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2008-04-30T21:20:01+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Parallelization in F#\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#article\",\"name\":\"Parallelization in F#\",\"headline\":\"Parallelization in F#\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2008-04-30T16:20:01+02:00\",\"dateModified\":\"2008-04-30T16:20:01+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#webpage\"},\"articleSection\":\"F#, Parallel Programming\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"name\":\".NET\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"position\":4,\"name\":\".NET\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/fsharp\\\/#listItem\",\"name\":\"F#\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/fsharp\\\/#listItem\",\"position\":5,\"name\":\"F#\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/fsharp\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#listItem\",\"name\":\"Parallelization in F#\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"name\":\".NET\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#listItem\",\"position\":6,\"name\":\"Parallelization in F#\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/fsharp\\\/#listItem\",\"name\":\"F#\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/\",\"name\":\"Parallelization in F#\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2008\\\/04\\\/30\\\/parallelization-in-f\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2008-04-30T16:20:01+02:00\",\"dateModified\":\"2008-04-30T16:20:01+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Parallelization in F#","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#article","name":"Parallelization in F#","headline":"Parallelization in F#","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2008-04-30T16:20:01+02:00","dateModified":"2008-04-30T16:20:01+02:00","inLanguage":"en-US","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#webpage"},"articleSection":"F#, Parallel Programming"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","name":".NET"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","position":4,"name":".NET","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/fsharp\/#listItem","name":"F#"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/fsharp\/#listItem","position":5,"name":"F#","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/fsharp\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#listItem","name":"Parallelization in F#"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","name":".NET"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#listItem","position":6,"name":"Parallelization in F#","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/fsharp\/#listItem","name":"F#"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/","name":"Parallelization in F#","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2008-04-30T16:20:01+02:00","dateModified":"2008-04-30T16:20:01+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"Parallelization in F#","og:url":"https:\/\/mariusbancila.ro\/blog\/2008\/04\/30\/parallelization-in-f\/","article:published_time":"2008-04-30T21:20:01+00:00","article:modified_time":"2008-04-30T21:20:01+00:00","twitter:card":"summary","twitter:title":"Parallelization in F#"},"aioseo_meta_data":{"post_id":"120","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:13:46","updated":"2025-12-12 07:19:10","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":2,"uagb_excerpt":"In my last post I was writing about parallelizing loops with Parallel.For in C#. Today I though it would be nice to try that in F#. So, here is the benchmarking of the matrix multiplication and the bubblesort algorithm in F4. Matrices Multiplication I started with a create_matrix function that creates and randomly initializes a&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/fsharp\/\" class=\"advgb-post-tax-term\">F#<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/parallel-programming\/\" class=\"advgb-post-tax-term\">Parallel Programming<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">F#<\/span>","<span class=\"advgb-post-tax-term\">Parallel Programming<\/span>"]}},"comment_count":"2","relative_dates":{"created":"Posted 18 years ago","modified":"Updated 18 years ago"},"absolute_dates":{"created":"Posted on April 30, 2008","modified":"Updated on April 30, 2008"},"absolute_dates_time":{"created":"Posted on April 30, 2008 4:20 pm","modified":"Updated on April 30, 2008 4:20 pm"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-1W","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=120"}],"version-history":[{"count":0,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/120\/revisions"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}