Jak działa równoległa pętla for ?

0

Mam następujący przykład, lecz do końca nie mogę zrozumieć jak działa tutaj równoległa pętla for.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProgramowanieRownolegle
{
    class Program
    {
        static private double obliczenia(double argument)
        {
            for(int i = 0; i < 10; ++i)
            {
                argument = Math.Asin(Math.Sin(argument));
            }
            return argument;
        }
        static void Main(string[] args)
        {
            int rozmiar = 10000;
            Random r = new Random();
            double[] tablica = new double[rozmiar];
            for (int i = 0; i < tablica.Length; i++) tablica[i] = r.NextDouble();

            int liczbaPowtorzen = 100;
            double[] wyniki = new double[tablica.Length];
            int start = System.Environment.TickCount;

            /* for (int powtorzenia = 0; powtorzenia < liczbaPowtorzen; ++powtorzenia)
                 for (int i = 0; i < tablica.Length; ++i)
                     wyniki[i] = obliczenia(tablica[i]); */

            for (int powtorzenia = 0; powtorzenia < liczbaPowtorzen; ++powtorzenia)
            {
                Parallel.For(0, tablica.Length, (int i) => wyniki[i] = obliczenia(tablica[i]));
            }

            int stop = System.Environment.TickCount;
            Console.WriteLine("Obliczenia sekwencyjne trwały " + (stop - start).ToString() + " ms.");
        }
    }
       
}

Czy jednocześnie wykonuję się pętla, która jest w metodzie For i pętla która jest w metodzie obliczenia czy jednocześnie się wykonuję pętla dotyczącą powtórzeń i pętla, która jest w metodzie For ?

0

Czy równolegle wykonuje się A i B, czy B i A? ;-)

Równolegle wykonuje się zawartość Parallel.For, co powoduje, że równolegle wykonuje się "metoda" obliczenia(), co powoduje, że równolegle wykonuje się for w tejże metodzie.

0

Parallel.For(0, tablica.Length, (int i) => wyniki[i] = obliczenia(tablica[i]));

Równolegle wykonują się wyrażenia podane jako ostatni parametr, czyli (int i) => wyniki[i] = obliczenia(tablica[i]). To co jest we wnętrzu tego wyrażenia to funkcji Parallel.For nie obchodzi - ona tylko tworzy taski i je odpala.

„Pętla dotycząca powtórzeń” nie ma żadnego związku z Parallel, i nie może się wykonywać równolegle.

0

Ok to już wiem, które pętle wykonują się w tym samym momencie. Działa to tak, że pętla z metody for wykonując się dla i = 0 jednocześnie wykonuje całego fora z metody obliczenia, później dla i = 1 wykonuje się jednocześnie cały for z metody obliczenia ? Czy inaczej działa synchronizacja w c#?

0

Nie jednocześnie, a równolegle. A synchronizacja nie ma tu nic do rzeczy, bo nie komunikujesz się pomiędzy wątkami, żadnych muteksów, semaforów itp z IPC.

0

Jednocześnie to nie to samo co równolegle ?

Ale jak wykonuję pętle dla i = 0 to w metodzie obliczenia możemy wykonać tylko obliczenia dla tego konkretnego i ? Chyba nie jest tak,że iteracja nie ma znaczenia i pętlę bez względu na to wykonują się równolegle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1