Wer bekommt das mit seinem C++ Compiler compiliert...



  • Jeder der sich traut soll mal versuchen folgenden Code zu kompilieren ( Voraussetzung ist Boost

    Ich selbst hab es bisher nicht geschafft. Mindestens sollte man g++ 3.4.x oder VC 7.1 verwenden. RAM Verbrauch mit sicherheit ( beim g++ zumindest ) mehr als 2 GB.

    Lasst mal hören wie lange es gedauert hat 😉

    [ Der Code berechnet via Brute Force die ersten 3 Vollkommenen Zahlen ( zwischen 1 und 500 ). Bestimmt kann man den Algorithmus tunen aber atm interessiert mich erst mal nur ob es einer fertig bringt das zu kompilieren. Ich selbst bin schon auf einen Server mit 2 Dual Core CPUs ausgewichen und mehr als 6 GB RAM und der ist atm schon über 50 Minuten am compilieren :p
    ]

    Edit: Update im moment ist er immer noch am kompilieren (112 Minuten) und braucht ca 3.4GB RAM ...

    Edit: Update Das kompilieren ist nach ca 150 Minuten abgebrochen (worden? ka war ja net mein server ) und ca 4 GB Ram verbrauch

    BR

    evilissimo

    #include <boost/mpl/long.hpp>
    #include <boost/mpl/range_c.hpp>
    #include <boost/mpl/vector_c.hpp>
    #include <boost/mpl/arithmetic.hpp>
    #include <boost/mpl/accumulate.hpp>
    #include <boost/mpl/back_inserter.hpp>
    #include <boost/mpl/equal.hpp>
    #include <boost/mpl/copy_if.hpp>
    #include <boost/mpl/at.hpp>
    #include <boost/mpl/size.hpp>
    #include <iostream>
    
    namespace mpl = boost::mpl;
    
    template < typename Sum , typename Div , typename Num >
    struct perf_num_plus_if : 
        mpl::if_<
            mpl::equal_to< 
                mpl::modulus< Num,Div > , 
                mpl::long_<0> 
            >,        
            typename mpl::plus<Sum,Div>::type,
            Sum
        >::type                
        {};
    
    template< typename Num >
        struct perf_num_impl :
            mpl::accumulate<
                mpl::range_c<
                    long,
                    1,
                    Num::value/2+1 
                >,
                mpl::long_<0>,
                perf_num_plus_if<
                    mpl::_,
                    mpl::_,
                    Num
                >
            >::type
        {};
    
    template< long Start , long End >
        struct  perfect_number :
            mpl::copy_if<
                mpl::range_c<long,Start,End>, 
                mpl::equal_to< mpl::_1 , perf_num_impl<mpl::_1> >, 
                mpl::back_inserter< mpl::vector_c<long> >
            >::type
        {};
    
    template< typename Seq , size_t Pos , size_t Max >
        struct Output
        {
            Output()
            {
               std::cout << mpl::at_c<Seq, Pos >::type::value << std::endl;               
               Output< Seq , Pos+1 , Max >();
            }
        };
    template< typename Seq , size_t N >
        struct Output< Seq , N , N >
        {
            Output(){}
        };
    
    int main()
    {
       typedef perfect_number< 1 , 500 > vec;
       Output< vec , 0 , mpl::size< vec >::value >();
    }
    


  • Scheinbar packt es VC 7.1 doch net ^^

    d:\boost\vc71\include\boost-1_33_1\boost\mpl\aux_\preprocessed\plain\apply_wrap.hpp(48): fatal error C1204: Compilerlimit: Interner Strukturüberlauf
    


  • ...oder das OS spielt bei 4GB nicht mehr mit 😃



  • Ponto hat es gestern auf nem 10 GB System gestartet und es war nach 4 Stunden immer noch net abgeschlossen. ( ca 5 GB RAM verbrauch )

    Ich bin ja mal gespannt was dabei rausgekommen ist *g*

    BR

    evilissimo



  • Welchen Vorteil hat es eigentlich, das du es mit Metaprogrammierung machst? Ist es nur ein technischer Test, oder soll es auch fachlich einen Sinn machen? Oder würde es ohne Metaprogrammierung auch nicht schneller sein?



  • Heute morgen sagt top folgendes:

    7514 bartosch 25 0 7365 7.1g 2848 R 99.9 0.3 11.3 708:42.08 cc1plus
    

    Die Geschwindigkeit der Speicherzunahme hat sich stark verlangsamt. Ich vermute der Kompiler hat da irgendwo eine quadratische Laufzeit. Vielleicht weil einige Dinge in Hashtables gespeichert werden, auf die nun sozusagen linear zugegriffen wird.

    Bis der Prozess die genehmigten 40GB erreicht, dürften noch Monate vergehen. Weiss jemand ob der Gcc 4 oder der Icc 9 da besser sind?



  • Artchi schrieb:

    Welchen Vorteil hat es eigentlich, das du es mit Metaprogrammierung machst? Ist es nur ein technischer Test, oder soll es auch fachlich einen Sinn machen? Oder würde es ohne Metaprogrammierung auch nicht schneller sein?

    Es sieht einfach besser aus. 😉



  • Jo, auflisten der Zahlen bis 500 geht aber auch mit template-meta schneller... einfach die Liste hinschreiben. 😃
    Wieviele gibt's bis 500? 10 Stück? Ne, ist schon zu viel oder?



  • Würde das zur Laufzeit auch so lange dauern?



  • Jester schrieb:

    Jo, auflisten der Zahlen bis 500 geht aber auch mit template-meta schneller... einfach die Liste hinschreiben. 😃
    Wieviele gibt's bis 500? 10 Stück? Ne, ist schon zu viel oder?

    Es werden genau 3 Zahlen berechnet.

    6
    28
    496

    Das wars dann auch schon. Aber irgendwie glaube ich langsam eher an einen Compiler Bug. Das es so lange dauert ist schon sehr verdächtig unrealistisch.

    @frage!
    Nein auf keinen Fall.

    BR
    evilissimo



  • Und welchen Sinn soll es dann haben?



  • Und welchen Sinn soll es dann haben?

    Villeicht soll es einfach nur Speicher fressen ....

    [ Der Code berechnet via Brute Force die ersten 3 Vollkommenen Zahlen ( zwischen 1 und 500 ). Bestimmt kann man den Algorithmus tunen aber atm interessiert mich erst mal nur ob es einer fertig bringt das zu kompilieren. Ich selbst bin schon auf einen Server mit 2 Dual Core CPUs ausgewichen und mehr als 6 GB RAM und der ist atm schon über 50 Minuten am compilieren :p
    ]



  • Artchi schrieb:

    Und welchen Sinn soll es dann haben?

    Vermutlich einfach experementier Freude oder einfach Spaß an der Freude. Wozu sollte es einen Sinn haben? Die Zahlen sind ja bekannt. Sie neu zu suchen würde, wenn wir schon von Sinn reden, wohl mit keiner Methode Sinn machen.

    🙄



  • Es soll zeigen das Template-Meta-Programmierung böse ist.



  • also ich habs jetzt auch mal probiert, folgendes system:

    -linux
    -Pentium 4 HT, 3.4 ghz
    -gcc 4.0.2
    -boost 1.32.0

    habs ein paar stündchen probiert, aber es war kein ende in sicht 😞

    also ich denke auch an einen bug 👍

    lg icepacker



  • Ich denke, es ist Zeit damit aufzuhören. Ich habe mal nicht die Zahlen von 1 bis 500 durchsuchen lassen sondern viel kleinere. Hier mal die Laufzeit:

    Limit  Zeit
    40     8 s
    80     212 s
    120    819 s
    160    2904 s
    200    9162 s
    

    Eine Erhöhung um 40 brachte eine Verlangsamung um mehr als 3 in jedem Fall mit leicht fallender Tendenz. Wenn ich das mal grob nach unten mit einer Verlangsamung von 2 abschätze, liegt die prognostizierte Laufzeit von 500 bei über 13 Tagen. Wenn die Verlangsamung bei über drei bleibt, sind es mindestens 231 Tage. Ich vermute mal, dass es irgendwo dazwischen liegt, aber am hinteren Ende.

    Bevor man hier von einem Bug sprechen kann, muss noch geklärt werden, wieviele Templates überhaupt instanziert werden. Wenn diese Zahl auch exponentiell wächst, kann der Compiler nichts dafür.

    Ansonsten ist es immer gut, wenn die Entwickler die Instanzierung von Templates beschleunigen können.



  • Ponto schrieb:

    Ich denke, es ist Zeit damit aufzuhören. Ich habe mal nicht die Zahlen von 1 bis 500 durchsuchen lassen sondern viel kleinere. Hier mal die Laufzeit:

    Limit  Zeit
    40     8 s
    80     212 s
    120    819 s
    160    2904 s
    200    9162 s
    

    Eine Erhöhung um 40 brachte eine Verlangsamung um mehr als 3 in jedem Fall mit leicht fallender Tendenz. Wenn ich das mal grob nach unten mit einer Verlangsamung von 2 abschätze, liegt die prognostizierte Laufzeit von 500 bei über 13 Tagen. Wenn die Verlangsamung bei über drei bleibt, sind es mindestens 231 Tage. Ich vermute mal, dass es irgendwo dazwischen liegt, aber am hinteren Ende.

    Bevor man hier von einem Bug sprechen kann, muss noch geklärt werden, wieviele Templates überhaupt instanziert werden. Wenn diese Zahl auch exponentiell wächst, kann der Compiler nichts dafür.

    Ansonsten ist es immer gut, wenn die Entwickler die Instanzierung von Templates beschleunigen können.

    Uh das ist richtig übel *g* Aber gut zu wissen. Danke Ponto 🙂

    @sinn-detector
    eigentlich nicht.

    @Artchi
    Wie kingruedi das schon richtig erkannt hat ist es einfach nur experimentier Freude. Ich finde das einfach interessant Code während des compilierens ausführen zu können.

    BR
    evilissimo



  • Ponto schrieb:

    ... liegt die prognostizierte Laufzeit von 500 bei über 13 Tagen.

    Ponto schrieb:

    Ich denke, es ist Zeit damit aufzuhören.

    Wieso!?? Zu Zeiten des C64 hat man doch auch die Kiste einen Monat lang interaktionslos laufen lassen, um zu prüfen, ob Leslie und Melissa nach Abflug vom Mars auch auf der Erde landen... 🤡



  • yeah "Zak McKracken and the Alien Mindbenders (1988)" rulez 🕶



  • Ponto schrieb:

    Ich denke, es ist Zeit damit aufzuhören. Ich habe mal nicht die Zahlen von 1 bis 500 durchsuchen lassen sondern viel kleinere. Hier mal die Laufzeit:

    Limit  Zeit
    40     8 s
    80     212 s
    120    819 s
    160    2904 s
    200    9162 s
    

    (...)

    Nur falls es wen interessiert...
    MSVC 8 SP1, P4 2.8C (Northwood), 2GB RAM:
    40: 0:04
    80: 0:31
    120: 2:16 (136s)
    160: nach 3:23 ein "c1xx : fatal error C1063: INTERNAL COMPILER ERROR" 😞


Anmelden zum Antworten