Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Параллельное выполнение в случае вложенных циклов

#c_sharp #многопоточность


Есть вложенный циклы, в результате они вызывают функцию для расчета данных, входными
параметрами которой являются 2 параметра index в циклах. Как можно максимально эффективно
реализовать распараллеливание прохода по циклам? По сути, я имею полный перебор двух
параметров.

double optResult = 0;
double result = 0;
for (int i = 5; i < 50; i = i + 5)
{
    for (int j = 5; j < 50; j = j + 5)
    {
        if (i < j)
        {
            optResult = OptimStart(i,j);
            if (optResult > result)
            {
                result = optResult;
            }
        }

    }
}

    


Ответы

Ответ 1



Я бы сделал как то так void Main() { var tuples = new List>(); for (int i = 5; i < 50; i = i + 5) { for (int j = i+5; j < 50; j = j + 5) { tuples.Add(Tuple.Create(i, j)); } } var max = tuples.AsParallel().Max(t=>Foo(t.Item1, t.Item2)); Console.WriteLine(max); } int Foo(int i, int j) { Thread.Sleep(1000); return i+j; } Если комбинаций слишком много и не хочется держать их в памяти, то void Main() { var max = GetItems().AsParallel().Max(t=>Foo(t.Item1, t.Item2)); Console.WriteLine(max); } int Foo(int i, int j) { Thread.Sleep(1000); return i+j; } IEnumerable> GetItems() { for (int i = 5; i < 50; i = i + 5) { for (int j = i + 5; j < 50; j = j + 5) { yield return Tuple.Create(i, j); } } }

Ответ 2



Я бы единственное предложил бы вложенный цикл начинать не с 5, а с i + 5, и тогда внутреннее условие if (i < j) можно убрать: double optResult = 0; double result = 0; for (int i = 5; i < 50; i = i + 5) { for (int j = i + 5; j < 50; j = j + 5) { optResult = OptimStart(i,j); if (optResult > result) { result = optResult; } } }

Комментариев нет:

Отправить комментарий