Loop-unrolling



  • Warum macht man Loop-Unrolling eigentlich immer mit Hilfe von Templaterekursionen? Könnte der Compiler nicht einfach auch selber eine stinknormale Schleife entrollen, wenn die obere Grenze der for-Schleife eine Compilezeitkonstante ist? Das sollte für den ja eigentlich einfacher sein, oder?



  • Zum Beispiel Potenzen:

    template<unsigned N, typename Type>
    	struct Power {
    		static Type of(Type value) { return value * Power<N - 1, Type>::of(value); }
    	};
    	template<typename Type>
    	struct Power<0, Type> {
    		static Type of(Type value) { return static_cast<Type>(1); }
    	};
    

    Wäre nicht

    template<unsigned N, typename Type>
    Type power(Type t)
    {
      Type ret = static_cast<Type>(1);
      for(unsigned i = N; i != 0; --i)
        ret *= t;
      return ret;
    }
    

    genau so einfach entrollbar für den Compiler?



  • ob dein Compiler das kann, kannst du ja ausprobieren.

    Der gcc mit -O2 -funroll-loops entrollt das untere Beispiel jedenfalls.


Anmelden zum Antworten