-
11. Data: 2011-02-02 19:05:42
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Fil <f...@p...onet.pl>
W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
> On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
> wrote:
>
>>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
>>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
>>> podobnych rzeczy a to potrafi spowolnić.
>>
>> A gdzie to wyłączyć?
> Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
> te opcje to:
> Integer Overflow Checking,
> Range Checking
Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
ale po wyłączeniu nic się nie zmieniło.
-
12. Data: 2011-02-02 19:15:56
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Grzegorz Krukowski <r...@o...pl>
On Wed, 02 Feb 2011 20:05:42 +0100, Fil <f...@p...onet.pl>
wrote:
>W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
>> On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
>> wrote:
>>
>>>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
>>>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
>>>> podobnych rzeczy a to potrafi spowolnić.
>>>
>>> A gdzie to wyłączyć?
>> Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
>> te opcje to:
>> Integer Overflow Checking,
>> Range Checking
>Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
>ale po wyłączeniu nic się nie zmieniło.
No ale ja doczytałem się o tych tablicach dynamicznych. To one sa
źródłem problemu. Z dynamicznymi tablicami możesz zrobić coś takiego:
k := 0;
SetLength(a, 4); // 4 rows
for i := 0 to 3 do begin // For each row
SetLength(a[i], i + 1); // Set the number of columns
for j := 0 to i do begin // Initialize the row
a[i,j] := k;
inc(k);
end;
end;
0 1 2 3
+---+
0 | 0 |
+---+---+
1 | 1 | 2 |
+---+---+---+
2 | 3 | 4 | 5 |
+---+---+---+---+
3 | 6 | 7 | 8 | 9 |
+---+---+---+---+
Czyli ty masz 300 tablic po 2000 elementów i, co najważniejsze tutaj,
każdy z osobną adresacją / obliczaniem indeksów. Czyli nie jest to
równoważnik tablicy dynamicznej z C/C++!
--
Grzegorz Krukowski
-
13. Data: 2011-02-02 19:30:53
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Fil <f...@p...onet.pl>
W dniu 2011-02-02 20:15, Grzegorz Krukowski pisze:
> On Wed, 02 Feb 2011 20:05:42 +0100, Fil<f...@p...onet.pl>
> wrote:
>
>> W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
>>> On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
>>> wrote:
>>>
>>>>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
>>>>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
>>>>> podobnych rzeczy a to potrafi spowolnić.
>>>>
>>>> A gdzie to wyłączyć?
>>> Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
>>> te opcje to:
>>> Integer Overflow Checking,
>>> Range Checking
>> Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
>> ale po wyłączeniu nic się nie zmieniło.
> No ale ja doczytałem się o tych tablicach dynamicznych. To one sa
> źródłem problemu. Z dynamicznymi tablicami możesz zrobić coś takiego:
>
> k := 0;
> SetLength(a, 4); // 4 rows
> for i := 0 to 3 do begin // For each row
> SetLength(a[i], i + 1); // Set the number of columns
> for j := 0 to i do begin // Initialize the row
> a[i,j] := k;
> inc(k);
> end;
> end;
>
> 0 1 2 3
> +---+
> 0 | 0 |
> +---+---+
> 1 | 1 | 2 |
> +---+---+---+
> 2 | 3 | 4 | 5 |
> +---+---+---+---+
> 3 | 6 | 7 | 8 | 9 |
> +---+---+---+---+
>
> Czyli ty masz 300 tablic po 2000 elementów i, co najważniejsze tutaj,
> każdy z osobną adresacją / obliczaniem indeksów. Czyli nie jest to
> równoważnik tablicy dynamicznej z C/C++!
No.. jeśli tak to wyjaśnia sprawę. Jednak na tablicach o ustalonym z
góry rozmiarze też wolniej pracuje program kompilowany pod Delphi (o ok.
0.7s).
-
14. Data: 2011-02-02 19:51:05
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Grzegorz Krukowski <r...@o...pl>
On Wed, 02 Feb 2011 20:30:53 +0100, Fil <f...@p...onet.pl>
wrote:
>W dniu 2011-02-02 20:15, Grzegorz Krukowski pisze:
>> On Wed, 02 Feb 2011 20:05:42 +0100, Fil<f...@p...onet.pl>
>> wrote:
>>
>>> W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
>>>> On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
>>>> wrote:
>>>>
>>>>>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
>>>>>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
>>>>>> podobnych rzeczy a to potrafi spowolnić.
>>>>>
>>>>> A gdzie to wyłączyć?
>>>> Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
>>>> te opcje to:
>>>> Integer Overflow Checking,
>>>> Range Checking
>>> Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
>>> ale po wyłączeniu nic się nie zmieniło.
>> No ale ja doczytałem się o tych tablicach dynamicznych. To one sa
>> źródłem problemu. Z dynamicznymi tablicami możesz zrobić coś takiego:
>>
>> k := 0;
>> SetLength(a, 4); // 4 rows
>> for i := 0 to 3 do begin // For each row
>> SetLength(a[i], i + 1); // Set the number of columns
>> for j := 0 to i do begin // Initialize the row
>> a[i,j] := k;
>> inc(k);
>> end;
>> end;
>>
>> 0 1 2 3
>> +---+
>> 0 | 0 |
>> +---+---+
>> 1 | 1 | 2 |
>> +---+---+---+
>> 2 | 3 | 4 | 5 |
>> +---+---+---+---+
>> 3 | 6 | 7 | 8 | 9 |
>> +---+---+---+---+
>>
>> Czyli ty masz 300 tablic po 2000 elementów i, co najważniejsze tutaj,
>> każdy z osobną adresacją / obliczaniem indeksów. Czyli nie jest to
>> równoważnik tablicy dynamicznej z C/C++!
>
>No.. jeśli tak to wyjaśnia sprawę. Jednak na tablicach o ustalonym z
>góry rozmiarze też wolniej pracuje program kompilowany pod Delphi (o ok.
>0.7s).
>
Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
D. Gregulec, J. Kaczmarek
Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
--
Grzegorz Krukowski
-
15. Data: 2011-02-02 19:55:00
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Fil <f...@p...onet.pl>
Jeszcze raz - ostatni test i podsumowanie:
PASCAL wariant 1 kompilator DELPHI: 8,2s
PASCAL wariant 2 kompilator DELPHI: 5,2s
CPP wariant 1 kompilator BUILDER: 4,5s
CPP wariant 2 kompilator BUILDER: 4,0s
CPP wariant 1 kompilator VISUAL: 1,4s
CPP wariant 2 kompilator VISUAL: 1,2s
I tyle w temacie :)
PS. Użyłem Visuala 2010 Ultimate.
Tablice źródłowe 2000 wierszy i 300 kolumn.
Tablica wynikowa 2000 wierszy i kolumn
Poniżej wklejam jeszcze raz procedury:
PASCAL wariant 1:
TMatrix = array of array of double;
procedure MulMatrix(N, Q, M:integer; T1, T2:TMatrix; var T3:TMatrix);
var
i, j, k:integer;
begin
for i := 0 to N-1 do
for j := 0 to M-1 do begin
T3[i, j] := 0;
for k := 0 to Q-1 do T3[i, j] := T3[i, j] + T1[i, k] * T2[k, j];
end;
end;
PASCAL wariant 2:
TA=array[0..1999,0..299] of double;
TB=array[0..299,0..1999] of double;
TC=array[0..1999,0..1999] of double;
procedure MulMatrix2(N, Q, M:integer; var T1:TA; var T2:TB; var T3:TC);
var
i, j, k:integer;
begin
for i := 0 to N-1 do
for j := 0 to M-1 do begin
T3[i, j] := 0;
for k := 0 to Q-1 do T3[i, j] := T3[i, j] + T1[i, k] * T2[k, j];
end;
end;
CPP wariant 1:
void MulTab(int N, int Q, int M, double** A, double** B, double** C)
{
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j) {
C[i][j] = 0;
for (int k = 0; k < Q; ++k) C[i][j] += A[i][k] * B[k][j];
}
}
CPP wariant 2:
void MulTab2(int N, int Q, int M, double** A, double** B, double** C)
{
int _M, _Q;
double R;
double** Ai;
double** Bj;
double* Aik;
double* Bjk;
double* Cij;
while (N--) {
Ai = A++;
Bj = B;
Cij = *C++;
_M = M;
while (_M--) {
Aik = *Ai;
Bjk = *Bj++;
R = 0;
_Q = Q;
while (_Q--) R += *Aik++ * *Bjk++;
*Cij++ = R;
}
}
}
Pozdrawiam,
Fil.
-
16. Data: 2011-02-02 19:56:18
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Fil <f...@p...onet.pl>
> Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
> Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
> D. Gregulec, J. Kaczmarek
> Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
> procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
> jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.
-
17. Data: 2011-02-02 20:03:29
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Grzegorz Krukowski <r...@o...pl>
On Wed, 02 Feb 2011 20:56:18 +0100, Fil <f...@p...onet.pl>
wrote:
>> Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
>> Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
>> D. Gregulec, J. Kaczmarek
>> Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
>> procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
>> jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
>
>Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.
Znaczy że Marciniak, czy te procedury nędzne są?
--
Grzegorz Krukowski
-
18. Data: 2011-02-02 20:50:58
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Fil <f...@p...onet.pl>
W dniu 2011-02-02 21:03, Grzegorz Krukowski pisze:
> On Wed, 02 Feb 2011 20:56:18 +0100, Fil<f...@p...onet.pl>
> wrote:
>
>>> Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
>>> Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
>>> D. Gregulec, J. Kaczmarek
>>> Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
>>> procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
>>> jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
>>
>> Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.
> Znaczy że Marciniak, czy te procedury nędzne są?
Nie... Może źle się wyraziłem. Książka jest bardzo fajna - dużo
ciekawych pomysłów w jednym miejscu. Kiedyś korzystałem z niej dużo.
Może brakuje porównania metod numerycznych względem siebie, np. pod
kątem szybkości działania. Marciniaka bardzo cenię. Po prostu teraz
jestem na etapie wymyślania jak napisać optymalny (szybki) kod,
jednocześnie używając ulubionych narzędzi (Builder do GUI z DevExpress i
TMS components), a nie zastanawiać się jak stworzyć procedurę numeryczną
przeliczającą coś tam. Wszystkie potrzebne procedurki już mam. :)
Muszę pomyśleć jak pożenić Visuala do obliczeń numerycznych i Buildera
do GUI...
Jeszcze raz dziękuję.
Fil.
-
19. Data: 2011-02-02 20:57:16
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Mariusz Marszałkowski <m...@g...com>
On 2 Lut, 17:47, Fil <f...@p...onet.pl> wrote:
> Witam!
>
> Są dwie procedury:
> CPP:
> void MulTab(int N, int Q, int M, double** A, double** B, double** C)
> {
> for (int i = 0; i < N; ++i)
> for (int j = 0; j < M; ++j) {
> C[i][j] = 0;
> for (int k = 0; k < Q; ++k) C[i][j] += A[i][k] * B[k][j];
> }
> }
>
> oraz PASCAL:
> TMatrix = array of array of double;
>
> procedure MulMatrix(N, Q, M:integer; T1, T2:TMatrix; var T3:TMatrix);
> var
> i, j, k:integer;
> begin
> for i := 0 to N-1 do
> for j := 0 to M-1 do begin
> T3[i, j] := 0;
> for k := 0 to Q-1 do T3[i, j] := T3[i, j] + T1[i, k] * T2[k, j];
> end;
> end;
>
> Kompiluję obie w BCB Builder 2010 i Delphi 2010 (odpowiednio) w trybie
> "release" z włączonymi optymalizacjami i odpalam.
> Dla rozmiarów N = 2000 i M = 300 mam takie czasy:
> CPP time = 4,5s
> PAS time = 8,2s
To jest raczej przypadkowy wynik, nie przejmowalbym sie takim
jednym pomiarem. Napisz 10 procedur, skompiluj roznymi
kompilatorami, uruchom kazda na 3-4 komputerach i wtedy
mozna pokusic sie o jakies wnioski.
Pozdrawiam
-
20. Data: 2011-02-02 20:58:03
Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Od: Grzegorz Krukowski <r...@o...pl>
On Wed, 02 Feb 2011 21:50:58 +0100, Fil <f...@p...onet.pl>
wrote:
>W dniu 2011-02-02 21:03, Grzegorz Krukowski pisze:
>> On Wed, 02 Feb 2011 20:56:18 +0100, Fil<f...@p...onet.pl>
>> wrote:
>>
>>>> Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
>>>> Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
>>>> D. Gregulec, J. Kaczmarek
>>>> Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
>>>> procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
>>>> jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
>>>
>>> Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.
>> Znaczy że Marciniak, czy te procedury nędzne są?
>Nie... Może źle się wyraziłem. Książka jest bardzo fajna - dużo
>ciekawych pomysłów w jednym miejscu. Kiedyś korzystałem z niej dużo.
>Może brakuje porównania metod numerycznych względem siebie, np. pod
>kątem szybkości działania. Marciniaka bardzo cenię. Po prostu teraz
>jestem na etapie wymyślania jak napisać optymalny (szybki) kod,
>jednocześnie używając ulubionych narzędzi (Builder do GUI z DevExpress i
>TMS components), a nie zastanawiać się jak stworzyć procedurę numeryczną
>przeliczającą coś tam. Wszystkie potrzebne procedurki już mam. :)
Aha.
>Muszę pomyśleć jak pożenić Visuala do obliczeń numerycznych i Buildera
>do GUI...
>
>Jeszcze raz dziękuję.
>Fil.
To tak, z tego co mi widomo, jak trochę się bawiłem w te sprawy, to:
* dla C/C++ najlepszym (b. dobrze optymalizującym) kompilatorem był
ten produkcji Intela;
* z części obliczeniowej zrób bibliotekę dll;
* tej biblioteki możesz użyć w czymkolwiek, np. w Delphi.
--
Grzegorz Krukowski