- Tsu,
Dans le cadre de mes études, j'ai un TP d'info toutes les semaines. Ce coup ci, le TP est sur le multithreading. Je pense avoir assez bien compris le concept et comment m'en servir. Ici je viens vous demander un coup de main sur un exo en particulier.
On doit simplement écrire la fonction factorielle, mais voilà, il y a un scoreboard pour montrer qui a les meilleurs perfs dans la promo. Ayant une réputation de hardcore teckie à tenir dans cette école, je prends ce genre de défis à la con très au sérieux. Le calcul doit obligatoirement être multithreadé. J'ai pensé à écrire une fonction qui multiplie les nombres de n à m. Ça permet de découper le calcul en petits fragments parallélisables. J'aurais donc pour factorielle 100 ce calcul :
1 2 3 4 5 6 7 8 9 10 | thread 1 : fact(2, 10) = 3628800 thread 2 : fact(11, 20) = 670442572800 thread 1 : fact(21, 30) = 109027350432000 thread 2 : fact(31, 40) = 3075990524006400 thread 1 : fact(41, 50) = 37276043023296000 thread 2 : fact(51, 60) = 273589847231500800 thread 1 : fact(61, 70) = 1439561377475020800 thread 2 : fact(71, 80) = 5974790569203456000 thread 1 : fact(81, 90) = 20759078324729606400 thread 2 : fact(91, 100) = 62815650955529472000 |
pendant ce temps là le thread 0 fait un join sur les deux autres (il les attend) puis il multiplie les dix résultats entre eux.
Là j'ai déjà deux problèmes. Premièrement, cette solution est sûrement très naïve, je suis sûr qu'il y a de bien meilleurs manières de faire. Je suis tombé là dessus : http://www.luschny.de/math/factorial/conclusions.html Je planche encore dessus. Deuxièmement, ce TP est à faire en C. Les tests effectués par nos profs seront faits avec n compris entre 500 et 700. Evidemment, 500! dépasse déjà de loin la taille de tous les types d'entiers standard que je connais. Du coup je vais devoir bidouiller.
Ceci m'amène à mes questions :
-
Est-ce que vous auriez des idées d'optimisations de la fonction factorielle ?
-
Qu'est-ce que vous suggérez comme manière de faire pour gérer des grands nombres en C sans perte de perfs.
Toutes les idées sont les bienvenues. Je suis ouvert aux solutions les plus originales. Le seul objectif est la vitesse d'exécution. Je suis en train de vérifier si j'ai le droit de charger un tableau de 200 chaînes de caractères écrites à la main (résultats précalculés et mis en dur dans le code source héhé) et surtout si ça vaut le coup d'un point de vue perfs. Je préfère éviter les instructions directement en assembleur tant que je ne connais pas la machine de tests.
Au fur et à mesure des idées proposées, je vais essayer de les implémenter, et je vous dirais quel est le temps pris par telle ou telle solution histoire qu'on parle pas juste dans le vide.
Merci pour votre lecture les agrumes !