gpt4 book ai didi

c# - 并行化 pi 数计算

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:46 25 4
gpt4 key购买 nike

下面的程序计算 pi=3.1415 最初是用 C++ 使用 OpenMP #pragma omp for 和 Reduction(+:sum) 编写的我正在尝试使用 Parallel.For 在 C#(新手)中进行相同的计算出于某种原因我无法让它工作,我如何让 C# 中的每个线程都私有(private) sum ?

using System;
using System.Diagnostics;
using System.Threading.Tasks;


namespace pi
{
class Program
{
static void Main(string[] args)
{
long num_steps = 100000000;
double step;
double x, pi, sum = 0.0;
step = 1.0 / num_steps;
Stopwatch timer = Stopwatch.StartNew();
Parallel.For(1, num_steps + 1, new ParallelOptions { MaxDegreeOfParallelism = 4 }, i =>
{
x = (i - 0.5) * step;
sum = sum + 4.0 / (1.0 + x * x);
});
pi = step * sum;
timer.Stop();
Console.WriteLine("\n pi with {0} steps is {1} in {2} miliseconds ", num_steps, pi, (timer.ElapsedMilliseconds));
Console.ReadKey();
}
}
}

最佳答案

我不认为通过使用 Parallel.For 并行化这个任务你会得到更好(更快)的结果。但如果您仍然想这样做 - 请查看 ThreadLocal类(class)。它为每个线程提供“私有(private)”存储。

long num_steps = 100000000;
var sum = new ThreadLocal<double>(true);
var step = 1.0 / num_steps;
Stopwatch timer = Stopwatch.StartNew();
Parallel.For(1, num_steps + 1, new ParallelOptions { MaxDegreeOfParallelism = 4 }, i =>
{
var x = (i - 0.5) * step;
sum.Value = sum.Value + 4.0 / (1.0 + x * x);
});
var pi = step * sum.Values.Sum();
timer.Stop();
sum.Dispose();
Console.WriteLine("\n pi with {0} steps is {1} in {2} miliseconds ", num_steps, pi, (timer.ElapsedMilliseconds));
Console.ReadKey();

关于c# - 并行化 pi 数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37894686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com