1

我有一台具有 8 GB 内存的 8 核 CPU 机器。从逻辑上讲,以下代码可以并行完成,但是由于循环提供了足够多的并行机会,因为可用的内核远少于循环的大小。其次,每个委托表达式都会分配一些内存来保存自由变量。在这种情况下是否建议使用并行?

在这种情况下,将 2 个并行 for 分成 2 个任务也会提高性能吗?

     private static void DoWork()
    {

        int end1 = 100; // minimum of 100 values; 
        int end2 = 100; // minimum of 100 values;


        Task a = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end1, delegate(int i)
                {
                    // independent work                     
                });
            }
        );

        Task b = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end2, delegate(int i)
                {
                    // independent work                        
                });
            }
        );

        a.Wait();
        b.Wait();         
    }
4

2 回答 2

1
  • 通过调用“Partitioner.Create”将负载平衡留给框架。
  • 尝试创建一个 ParallelOptions 对象并将其传递给 Parallel.For。尝试使用不同的 MaxDegreeOfParallelism 并根据结果调整您的代码,这个数字可能比没有更多。系统中的核心数。这对我有用。
于 2010-10-16T09:25:59.460 回答
1

在这种情况下,将 2 parralel for 分成 2 个任务也会提高性能吗?

不明显,您很容易损害性能。

TPL 专门设计用于提供负载平衡,让它发挥作用。

您关心的要点是:

  • “工作”真的应该是独立的
  • “工作”应该是不平凡的,即计算密集型并且远远超过仅仅添加几个数字
  • “工作”应避免 I/O(尽可能)
于 2010-10-16T09:30:40.813 回答