Zkušenosti s jazykem D

JSH

Re:Zkušenosti s jazykem D
« Odpověď #105 kdy: 26. 02. 2014, 22:13:42 »
BTW, všimli jste si že při tom přechodu od 2D k brutálně zoptimalizovanému kódu 1D vám tam vypadla jedna nula, že? Těch 700ms najednou není kdovíjak brutální zrychlení.


RAII

Re:Zkušenosti s jazykem D
« Odpověď #106 kdy: 26. 02. 2014, 22:14:52 »
vidíš 0,01s -> to je 10 ms ... přepsal sem se xD

RAII

Re:Zkušenosti s jazykem D
« Odpověď #107 kdy: 26. 02. 2014, 22:18:30 »
TO JSH -> to brutální zrychlení udělalo G++ díky šablonám. Stejnou schopnost má i D, akorát GDC to nezoptimalizovalo :(. Jinak pokud se bavíme o dynamických maticích (nezadrátovaných v době kompilace), je D vítěz.

Sten

Re:Zkušenosti s jazykem D
« Odpověď #108 kdy: 26. 02. 2014, 22:31:21 »
A ještě jsem si teď všiml, že ty počty nesedí. Ta funkce size se v původním kódu jenom v tom vnitřním foru volala 10 000 000 000× (100 vnitřní for × 100 vnější for × 1 000 000 iterací sčítání). Po úpravě na count se snížil počet volání na 100 000 000×.

Jinak pokud se bavíme o dynamických maticích (nezadrátovaných v době kompilace), je D vítěz.

Cože? Když jsem v tom mém kódu tu šablonu změnil na dynamickou velikost, tak C++ to dalo za cca 220 ms a D za cca 780 ms.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #109 kdy: 26. 02. 2014, 22:42:19 »
dáš sem prosím ten 220 ms C++ kód? Asi si ho už někde dával, ale nechce se mi hledat. AD, no funkce size se spustí 10 100 022 200. 990 ns na jedno volání funkce. Je v ní 13 instrukcí. Jedno se ti musí nechat, počítat umíš. Ale 13 instrukcí prostě 990 ns nedá ani zbla. Když budu počítat že každá instrukce přistupuje do registru a paměti. Tak jedna instrukce sežere 1ns + 2ns + 8ns = 11ns. Za 990 ns bys stihnul kolem 90 takovejhle instrukcí. A to počítám s odhadem, tvůj procák bude mnohem rychlejší (IPS ??). BTW, některé instrukce pracují jen s registry takže v tom případě jen 5ns


JSH

Re:Zkušenosti s jazykem D
« Odpověď #110 kdy: 26. 02. 2014, 22:43:21 »
TO JSH -> to brutální zrychlení udělalo G++ díky šablonám. Stejnou schopnost má i D, akorát GDC to nezoptimalizovalo :(. Jinak pokud se bavíme o dynamických maticích (nezadrátovaných v době kompilace), je D vítěz.
Nikoliv, pořád jsi neposlal zoptimalizovaný kód který by sčítal co nejrychleji dvě matice 100x100 (dohromady 10k prvků). Co jsi sem dal byl zoptimalizovaný kód který sčítá 1000 prvků, tedy 10x míň. Pokud budu vařit z vody a vynásobím dobu běhu 10x, tak jsem na 7 sekundách. To je +- to samé, co jsi psal ve 20:08 o svém původním kódu.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #111 kdy: 26. 02. 2014, 22:49:35 »
Další chybka. Zapoměl sem jednu 0 ... no výsledek je 6,7s...škoda 700ms vypadalo cool ...

RAII

Re:Zkušenosti s jazykem D
« Odpověď #112 kdy: 26. 02. 2014, 22:55:37 »
HEJ drsný. Zkusil sem DMD, 10 000 prvků to dalo za 1,7s. Ještě zkusim u DMD optimalizaci šablonama. Vypadá to že GDC je pěkne neoptimalizovaný.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #113 kdy: 26. 02. 2014, 23:01:17 »
Tak nic s šablonovejma optimalizacema je to 2s. Jak vidno ani DMD to nemá zoptimalizováno (to spíš zhoršuje xD zajímavé).

Sten

Re:Zkušenosti s jazykem D
« Odpověď #114 kdy: 26. 02. 2014, 23:03:51 »
dáš sem prosím ten 220 ms C++ kód? Asi si ho už někde dával, ale nechce se mi hledat.

Kód: [Vybrat]
#include <iostream>
#include <random>

template <typename T>
void mAdd(T *matA,
          const T *matB,
          unsigned size)
{
        for (long i = 0; i < size; ++i)
                matA[i] += matB[i];
}

int main()
{
        std::random_device rnd;
        int v0[10000];
        int v1[10000];
        for (int i = 0; i < 10000; ++i)
                v0[i] = v1[i] = rnd() % 10;
        for (int i = 0; i < 1000000; ++i)
                mAdd(v0,v1,10000);
        return 0;
}

Tohle už má 10 000 prvků a běží 2,4 až 2,5 s.

AD, no funkce size se spustí 10 100 022 200. 990 ns na jedno volání funkce. Je v ní 13 instrukcí. Jedno se ti musí nechat, počítat umíš. Ale 13 instrukcí prostě 990 ns nedá ani zbla. Když budu počítat že každá instrukce přistupuje do registru a paměti. Tak jedna instrukce sežere 1ns + 2ns + 8ns = 11ns. Za 990 ns bys stihnul kolem 90 takovejhle instrukcí. A to počítám s odhadem, tvůj procák bude mnohem rychlejší (IPS ??). BTW, některé instrukce pracují jen s registry takže v tom případě jen 5ns

10 sekund / 10 100 022 200 = 0,99 ns ;D

Kozzi

Re:Zkušenosti s jazykem D
« Odpověď #115 kdy: 26. 02. 2014, 23:17:33 »
to Sten: jinak ten kod v c++ co si udaval jak mel bezt 5ms, tak neni divu ze bezel tak malo, zkus si tam pridat treba vypis jednoho prvku z toho pole, aby to kompilator zcela nesmazal ten cyklus :D. Takze to vlastne vubec nic nedelalo, proto tech 5ms ;-), tech 239ms je uz spravne, D to dokaze za 520ms to znamena ze je priblizne 2x pomalejsi v tomto pripade.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #116 kdy: 26. 02. 2014, 23:19:05 »
Takže rekapitulace -> tvůj kód bez šablonovejch optimalizací sežere 2,4 s. Muj 1,7s. 10 sekund / 10 100 022 200 = 0,99 ns. Hele, furt na to koukám a kroutím hlavou. Neuvědomuju si kde sem udělal chybu ale to je teď jedno. Jaký IPS má proboha tvůj procák? Na jedno volání funkce s 13 instrukcema totiž padne 1ns... ...

Kozzi

Re:Zkušenosti s jazykem D
« Odpověď #117 kdy: 26. 02. 2014, 23:22:08 »
to Sten: jinak ten kod v c++ co si udaval jak mel bezt 5ms, tak neni divu ze bezel tak malo, zkus si tam pridat treba vypis jednoho prvku z toho pole, aby to kompilator zcela nesmazal ten cyklus :D. Takze to vlastne vubec nic nedelalo, proto tech 5ms ;-), tech 239ms je uz spravne, D to dokaze za 520ms to znamena ze je priblizne 2x pomalejsi v tomto pripade.

ta rychlost pro D je v pripade gdc, pokud se pouzije oficialni kompilator dmd tak to ma vykon okolo 200ms takze je to srovnatelne, pravdepodobne nejaka chybka, zareportuji to jak na gdc tak i na ldc, protoze se to tyka obou kompilatoru. Ackoliv je mozne ze je problem uz ve frontu, kde dmd je ve verzi 2.65 kdezto ldc i gdc maji teprve front ve verzi 2.63

Sten

Re:Zkušenosti s jazykem D
« Odpověď #118 kdy: 26. 02. 2014, 23:27:46 »
Takže rekapitulace -> tvůj kód bez šablonovejch optimalizací sežere 2,4 s. Muj 1,7s.

Na různých procesorech a nejspíš s různým měřením, což je porovnání jak noha. Když jsem vzal poslední zde postovaný kód, změnil 1000 na 10000, vyhodil StopWatch a změřil to přes time, trvá to Déčku 7,7 s na procesoru, kde C++ sežere 2,4.

10 sekund / 10 100 022 200 = 0,99 ns. Hele, furt na to koukám a kroutím hlavou. Neuvědomuju si kde sem udělal chybu ale to je teď jedno. Jaký IPS má proboha tvůj procák? Na jedno volání funkce s 13 instrukcema totiž padne 1ns... ...

Jestli to nebude tím, že se žádná funkce nevolá, protože se inlineuje, a pak to použije jen jednu instrukci ;)

Sten

Re:Zkušenosti s jazykem D
« Odpověď #119 kdy: 26. 02. 2014, 23:30:25 »
to Sten: jinak ten kod v c++ co si udaval jak mel bezt 5ms, tak neni divu ze bezel tak malo, zkus si tam pridat treba vypis jednoho prvku z toho pole, aby to kompilator zcela nesmazal ten cyklus :D. Takze to vlastne vubec nic nedelalo, proto tech 5ms ;-), tech 239ms je uz spravne, D to dokaze za 520ms to znamena ze je priblizne 2x pomalejsi v tomto pripade.

Hmm, tak to jsem nezkoumal, čekal jsem, že to kompilátor celé vypočte za compile time :)