.NET 4.x Parallel.ForEach даёт небольшой прирост производительности - C#

Узнай цену своей работы

Формулировка задачи:

Parallel.ForEach даёт небольшой прирост производительности в сравнении с одно поточной версией всего в 1,5 - 1,8 раз. Причем проц поддерживает 8 потоков. В чём может быть косяк?
        private readonly float[] _wm; // минимальный размер который встречался ~78 000 000 
        // _wm заполняется при инициализации объекта в котором всё это 
 
        public void Sub(float v, float d, float[] x)
        {
            var rangePartitioner = Partitioner.Create(0, _wm.Length,
                          _wm.Length / Environment.ProcessorCount);
            Parallel.ForEach(rangePartitioner, (range, loopState) =>
            {
                for (var i = range.Item1; i < range.Item2; i++)
                {
                    _wm[i] += v * d * x[i];
                }
            });
        }

Решение задачи: «.NET 4.x Parallel.ForEach даёт небольшой прирост производительности»

textual
Листинг программы
using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
 
namespace ThreadsTest
{
    class Program
    {
        private static float[] _wm; // минимальный размер который встречался ~78 000 000 
                                    // _wm заполняется при инициализации объекта в котором всё это 
 
        public static void AuthorsSub(float v, float d, float[] x)
        {
            var rangePartitioner = Partitioner.Create(0, _wm.Length,
                          _wm.Length / Environment.ProcessorCount);
            Parallel.ForEach(rangePartitioner, (range, loopState) =>
            {
                for (var i = range.Item1; i < range.Item2; i++)
                {
                    _wm[i] += v * d * x[i];
                }
            });
        }
 
        public static void FreebaSub(float v, float d, float[] x)
        {
            Parallel.For(0, _wm.Length, i =>
            {
                _wm[i] = v*d*x[i];
            });
        }
 
        static void Main(string[] args)
        {
            System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Highest;
            Stopwatch sw;
            int size = 120 * 1000 * 1000;
            _wm = new float[size];
            var x = new float[size];
 
            AuthorsSub(1.4f, 6.3f, x);
            FreebaSub(1.4f, 6.3f, x);
 
            Randomize(_wm, x);
            Console.WriteLine(nameof(AuthorsSub));
            sw = Stopwatch.StartNew();
            AuthorsSub(1.4f, 6.3f, x);
            Console.WriteLine(sw.Elapsed);
            Console.WriteLine();
 
            Randomize(_wm, x);
            Console.WriteLine(nameof(FreebaSub));
            sw = Stopwatch.StartNew();
            FreebaSub(1.4f, 6.3f, x);
            Console.WriteLine(sw.Elapsed);
            Console.WriteLine();
        }
 
        private static void Randomize(float[] wm, float[] x)
        {
            var rand = new Random();
            for (int i = 0; i < wm.Length; i++)
            {
                wm[i] = rand.Next();
                x[i] = rand.Next();
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы