Documente Academic
Documente Profesional
Documente Cultură
NET)
Șablonul Parallel Loop se folosește atunci când este nevoie de realizarea unor
operații independente pentru fiecare element al unei colecții sau pentru un
număr fix de iterații. Pașii unei bucle sunt independenți dacă aceștia nu scriu în
locații de memorie sau fișiere citite de alți pași.
Sintaxa unei bucle în paralel este similară cu cea a unui for sau foreach, dar
bucla în paralel rulează mai repede pe un calculator ce conține nuclee
disponibile. Altă diferență este reprezentată de faptul că, spre deosebire de o
buclă secvențială, ordinea execuției nu este definită într-o buclă paralelă. Pașii,
de obicei, au loc, în paralel, în același timp. Uneori, doi pași au loc în ordinea
opusă celei care ar exista într-o buclă secvențială. Singura garanție este aceea
că, toate iterațiile buclei vor fi rulat pana la finalizarea buclei.
using System;
using System.Diagnostics;
using System.Threading.Tasks;
class MultiplyMatrices
{
// Sequential
static void MultiplyMatricesS(double[,] matA, double[,] matB,
double[,] result)
{
int matACols = matA.GetLength(1);
int matBCols = matB.GetLength(1);
int matARows = matA.GetLength(0);
//Parallel
static void MultiplyMatricesP(double[,] matA, double[,] matB, double[,] result)
{
int matACols = matA.GetLength(1);
int matBCols = matB.GetLength(1);
int matARows = matA.GetLength(0);
// Main
static void Main(string[] args)
{
// Set up matrices.
int colNr = 180;
int rowNr = 2000;
int colNr2 = 270;
double[,] m1 = InitializeMatrix(rowNr, colNr);
double[,] m2 = InitializeMatrix(colNr, colNr2);
double[,] result = new double[rowNr, colNr2];
// Sequential version
Console.Error.WriteLine("Executing sequential version...");
Stopwatch watch = new Stopwatch();
watch.Start();
// Print result
// Parallel version
Console.Error.WriteLine("Executing parallel version...");
watch.Start();
MultiplyMatricesP(m1, m2, result);
watch.Stop();
Console.Error.WriteLine("Parallel version time (ms): {0}",
watch.ElapsedMilliseconds);
//Other Methods
static double[,] InitializeMatrix(int rows, int cols)
{
double[,] matrix = new double[rows, cols];
Console.WindowWidth = 160;
Console.WriteLine();
for (int x = 0; x < rowCount; x++)
{
Console.WriteLine("ROW {0}: ", x);
for (int y = 0; y < colCount; y++)
{
Console.Write("{0} ", matrix[x, y]);
}
Console.WriteLine();
}
Console.WriteLine();
}
// End Other Methods
}