Witam serdecznie,
Dzisiaj mam do Was forumowicze (drodzy ) następne pytanie z cyklu: O CO KAMAN DO CHOLERY! Otóż w walce z moja pracą inżynierską (optymalizacja metod numerycznych przy wykorzystania wielowątkowości), przepisywałem wraz z promotorem "model matematyczny", z języka c++ do C#, program oblicza kilka macierzy, przekształca je dodaje, mnoży itp... to nie jest w tym momencie tak istotne. Istotna natomiast jest taka sprawa ze napisałem metodę do której przekazuje dwa parametry (które są zmiennymi int) parametry te określają "i" dla pętli for czyli jej start (N1) i koniec (N2) maksymalnie pętla iteruje od 1 do 23 (to są elementy 25-cio elementowego modułu).
Problem polega na tym że kiedy wywołuje metodą w ten sposób:
Obliczenia_A(1,23);
Czas wychodzi mi ok 6s, natomiast jeżeli rozbije ta petle na:
Obliczenia_A(1,5);
Obliczenia_A(6,11);
Obliczenia_A(12,18);
Obliczenia_A(19,23);
To czas "MAGICZNIE" skraca się do ok 1-1,5s??? O co chodzi nie stosuje jeszcze wielowątkowości a aplikacja już niby przyspiesza, dodam ze przy pierwszym i drugim sposobie zwraca mi prawidłowe wyniki, a promotor naciska mnie że po co w takim razie wielowątkowość??? Sprawdzałem timerami i zwalnia mi ta metoda przy zerowaniu macierzy (tablicy) trójelementowej ale wg. mojej oceny jest to bez sensu :/
int i, i1, i2, k, j;
//Obliczanie macierzy A (metoda interpolacji Eulera)
for (int N = N1; N <= N2; N++)
{
for (i = 1; i <= 3; i++)
{
matrixA[i, i, N] = 1.0 / (daneRL[i + 3 + (N - 1) * 6] + dt * daneRL[i + (N - 1) * 6]);
}
for (i = 4; i <= 6; i++)
{
matrixA[i, i, N] = matrixA[i - 3, i - 3, N];
}
matrixA[4, 1, N] = -matrixA[1, 1, N];
matrixA[5, 2, N] = -matrixA[2, 2, N];
matrixA[6, 3, N] = -matrixA[3, 3, N];
matrixA[1, 4, N] = matrixA[4, 1, N];
matrixA[2, 5, N] = matrixA[5, 2, N];
matrixA[3, 6, N] = matrixA[6, 3, N];
for (i = N1; i <= N2; i++) //W tym miejscu zwalnia...
{
for (i1 = 1; i1 <= 38; i1++)
{
for (i2 = 1; i2 <= 6; i2++)
{
matrixPA[i1, i2, i] = 0.0;
}
}
for (j = 1; j <= macP[i, 0]; j++)
{
i1 = (macP[i, j] - 1) / 6 + 1;
i2 = macP[i, j] - (i1 - 1) * 6;
for (k = 1; k <= 6; k++)
{
matrixPA[i1, k, i] = matrixPA[i1, k, i] + matrixA[i2, k, i];
}
}
}
for (i = N1; i <= N2; i++)
{
for (i1 = 1; i1 <= 38; i1++)
{
for (i2 = 1; i2 <= 38; i2++)
{
matrixPAP[i1, i2, i] = 0.0;
}
}
for (j = 1; j <= macP[i, 0]; j++)
{
i1 = (macP[i, j] - 1) / 6 + 1;
i2 = macP[i, j] - (i1 - 1) * 6;
for (k = 1; k <= 38; k++)
{
matrixPAP[k, i1, i] = matrixPAP[k, i1, i] + matrixPA[k, i2, i];
}
}
}
}
return matrixPAP;
}
Proszę o jakąś podpowiedź, myslałem że kompilator sprowadza wszytsko do binarki i czy odpale pare metod z innymi parametrami czy jedna z calym "zakresem" to i tak czas powinien byc bardzo podobny.
Pozdrawiam, jak by ktoś sie zainteresował tym tematem to mogę udostępnić jeszcze jakieś informacje.