【问题标题】:How to run a Parallel.For loop for a condition如何为条件运行 Parallel.For 循环
【发布时间】:2014-03-22 17:00:02
【问题描述】:

我是 C# 并行编程的新手,发现很难实时实现。这是我的查询:

public string[] SequentialFun(int count)
{
    string[] results = new string[count];
    for(int run = 0; run < count; run++)
    {
        while(true)
        {
           //Generate a Random Number (62 bit) and store it in variable 'randNum'
           if(randNum is prime)
           {
               results[run] = randNum.ToString();
               break;
           }
        }
    }
    return results;
}   
  1. 如何对上述函数应用并行编程来提高速度?
  2. 告诉我如何运行Parallel.For 循环直到一个条件? 请解释并帮我详细解释。

【问题讨论】:

  • 并行并不总是“提高速度”的代名词。
  • 正如@SimonWhitehead 所说,在考虑cpu 的架构时应该使用并行编程。它不一定会转化为更快的代码执行速度。
  • 这是一个令人尴尬的并行问题(假设is prime 检查不使用共享数据结构)。使用并行性显然是有利的,除非您在超过 8 年的 CPU 上运行。
  • @Douglas 当然.. 只是指出 OP 声明中的一个错误。

标签: c# loops for-loop parallel-processing conditional-statements


【解决方案1】:

您应该使用Parallel.For 方法并将您的逻辑放在匿名委托中:

Parallel.For(0, count, (i, results) =>
    {
       while(true)
       {
          //Generate a Random Number (62 bit) and store it in variable 'randNum'
          if(randNum is prime)
          {
              results[run] = randNum.ToString();
              break;
          }
       }
    }
);

请记住,尽管使用Parallel.For 并不意味着代码执行效率会提高 x 倍,因为它取决于处理器内核的数量。

【讨论】:

  • 我收到一个错误:无法将 Lamba 表达式转换为类型“System.Threading.Tasks.PrallelOptions”,因为它不是委托类型。
【解决方案2】:

只需替换您的顺序循环:

for (int run = 0; run < count; run++)
{
    // ...
}

...有一个平行的:

Parallel.For(0, count, run =>
{
    // ...
});

【讨论】:

  • 是的,它的工作。但是这个语句 results[run] = randNum.ToString();总是只更新一个字符串。
  • 确保randNum 变量在并行循环内部声明。
猜你喜欢
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多