Même lorsqu'on compile pour sa propre plateforme, on compile très rarement pour une architecture très précise. En gros, ceux qui font cela sont par exemple les gens sous Gentoo, ou bien des fous de l'optimisation. J'imagine aussi que dans le monde des jeux vidéos ultra-performants (c'est juste une hypothèse, je sais pas s'ils font vraiment ça), les dévs vont compiler plusieurs versions pour les processeurs et CG majeurs, et vont embarquer ainsi toutes ces versions alternatives dans leur installeur qui détectera en temps réel et installera une version optimisé si possible (une version plus générique sinon).
Mais à part ça, les développeurs se contentent de fournir deux versions pour x86 (une 32 et une 64-bit), pareil pour Mac, et pour Linux, etc. (ça fait déjà pas mal de versions!)
Et encore certains se contentent de 32-bit en se disant que de toutes façons, tous les OS 64-bit ont un layer de compatibilité 32-bit. Voire même livrent le binaire Win pour Nux en embarquant Wine. On a tous vu ça, n'est-ce pas?
Donc ./configure, même si la cible est ta propre plateforme, va fournir par défaut un binaire générique (c'est à dire un code non optimisé pour le plus petit dénominateur commun similaire à ta machine, par ex "tout processeur x86 32-bit"), et non un binaire optimisé pour ton proc exact. Parce que c'est ce que la plupart des gens veulent. Si tu veux du code spécifique, tu dois spécifier explicitement l'architecture à ton compilateur. Par exemple, fait un man gcc. Regarde des options du type -march, -mcpu, -mtune, déjà. Et encore ça c'est de la petite optimisation. Après chaque architecture a son propre lot d'options spécifiques pour aller plus loin, activer ou non des fonctionnalités, etc. Normalement tu vas activer de telles options en modifiant ton CFLAGS pour C, CXXFLAGS pour C++, etc.
J'en dirais pas plus parce que je suis loin d'être un pro de l'optimisation. Le plus loin que j'ai fait, c'est quand j'utilisais Gentoo, et encore je me contentais de spécifier l'architecture processeur.
En général, je fais plutôt comme tout le monde: je fais simple et compile générique. :-)
Donc est-ce que crossroad peut aussi compiler avec des optimisations? Ben j'ai pas testé, mais étant donné que MinGW-w64 se base sur gcc, je pense que oui. J'imagine qu'il suffit de choisir tes options, faire divers CFLAGS pour les diverses architectures particulières que tu veux, puis faire un export CFLAGS="-some-great-optimization -another" (tu fais un man gcc et tu fais ton marché). Bien sûr, fait ça avant de commencer à configurer (crossroad configure) et compiler pour que ce soit bien pris en compte.
En outre je te conseille fortement d'ajouter tes flags l'un après l'autre, reconfigurer, compiler, tester. Avec les optimisations, on peut beaucoup plus facilement casser un binaire (même si a priori, la compilation semble finir bien), ne serait-ce que parce que ce sont des options moins utilisées, donc moins testées, du compilateur.
Enfin y a pas mal de trucs qui se font à l'exécution, et non pas à la compilation. Par exemple tu nous dis que t'as une fonction pour savoir le nombre de proc. Donc c'est pour changer ton fonctionnement à l'exécution (par exemple décider du parallélisme de ton code en fonction du nombre de proc, etc). Ça n'impacte pas la compilation; et franchement j'ai jamais vu de ma vie un code où on choisit le nombre de cœurs à la compilation, surtout que de nos jours, y a de tout, même dans le grand public! À chaque sortie de ton logiciel, tu le compilerais 50 fois. C'est pas tenable. X-/
Pareil OpenCL (qu'on utilise aussi dans GEGL, donc dans GIMP) fait du code portable. Si j'ai bien compris (j'ai pas encore touché de code OpenCL, donc il se peut que je dise des bêtises), c'est même l'un des points majeurs d'OpenCL: faire du code portable plutôt que spécifique, tout en permettant de tirer profit du nombre de cœurs à l'exécution, de spécificités de et optimisations pour certains CPU et GPU, etc. Donc pareil, tu gères à l'exécution, pas à la compilation.
J'espère que ça aide.
Film d'animation libre en CC by-sa/Art Libre, fait avec GIMP et autre logiciels libres: ZeMarmot [ http://film.zemarmot.net ]
[^] # Re: Cross compiler vers du matériel différent ?
Posté par Jehan (site web personnel, Mastodon) . En réponse à la dépêche À la Croisée des Chemins: crossroad, environnement de cross-compilation. Évalué à 4.
Salut,
Même lorsqu'on compile pour sa propre plateforme, on compile très rarement pour une architecture très précise. En gros, ceux qui font cela sont par exemple les gens sous Gentoo, ou bien des fous de l'optimisation. J'imagine aussi que dans le monde des jeux vidéos ultra-performants (c'est juste une hypothèse, je sais pas s'ils font vraiment ça), les dévs vont compiler plusieurs versions pour les processeurs et CG majeurs, et vont embarquer ainsi toutes ces versions alternatives dans leur installeur qui détectera en temps réel et installera une version optimisé si possible (une version plus générique sinon).
Mais à part ça, les développeurs se contentent de fournir deux versions pour x86 (une 32 et une 64-bit), pareil pour Mac, et pour Linux, etc. (ça fait déjà pas mal de versions!)
Et encore certains se contentent de 32-bit en se disant que de toutes façons, tous les OS 64-bit ont un layer de compatibilité 32-bit. Voire même livrent le binaire Win pour Nux en embarquant Wine. On a tous vu ça, n'est-ce pas?
Donc
./configure, même si la cible est ta propre plateforme, va fournir par défaut un binaire générique (c'est à dire un code non optimisé pour le plus petit dénominateur commun similaire à ta machine, par ex "tout processeur x86 32-bit"), et non un binaire optimisé pour ton proc exact. Parce que c'est ce que la plupart des gens veulent. Si tu veux du code spécifique, tu dois spécifier explicitement l'architecture à ton compilateur. Par exemple, fait unman gcc. Regarde des options du type -march, -mcpu, -mtune, déjà. Et encore ça c'est de la petite optimisation. Après chaque architecture a son propre lot d'options spécifiques pour aller plus loin, activer ou non des fonctionnalités, etc. Normalement tu vas activer de telles options en modifiant ton CFLAGS pour C, CXXFLAGS pour C++, etc.J'en dirais pas plus parce que je suis loin d'être un pro de l'optimisation. Le plus loin que j'ai fait, c'est quand j'utilisais Gentoo, et encore je me contentais de spécifier l'architecture processeur.
En général, je fais plutôt comme tout le monde: je fais simple et compile générique. :-)
Donc est-ce que crossroad peut aussi compiler avec des optimisations? Ben j'ai pas testé, mais étant donné que MinGW-w64 se base sur gcc, je pense que oui. J'imagine qu'il suffit de choisir tes options, faire divers CFLAGS pour les diverses architectures particulières que tu veux, puis faire un
export CFLAGS="-some-great-optimization -another"(tu fais unman gccet tu fais ton marché). Bien sûr, fait ça avant de commencer à configurer (crossroad configure) et compiler pour que ce soit bien pris en compte.En outre je te conseille fortement d'ajouter tes flags l'un après l'autre, reconfigurer, compiler, tester. Avec les optimisations, on peut beaucoup plus facilement casser un binaire (même si a priori, la compilation semble finir bien), ne serait-ce que parce que ce sont des options moins utilisées, donc moins testées, du compilateur.
Enfin y a pas mal de trucs qui se font à l'exécution, et non pas à la compilation. Par exemple tu nous dis que t'as une fonction pour savoir le nombre de proc. Donc c'est pour changer ton fonctionnement à l'exécution (par exemple décider du parallélisme de ton code en fonction du nombre de proc, etc). Ça n'impacte pas la compilation; et franchement j'ai jamais vu de ma vie un code où on choisit le nombre de cœurs à la compilation, surtout que de nos jours, y a de tout, même dans le grand public! À chaque sortie de ton logiciel, tu le compilerais 50 fois. C'est pas tenable. X-/
Pareil OpenCL (qu'on utilise aussi dans GEGL, donc dans GIMP) fait du code portable. Si j'ai bien compris (j'ai pas encore touché de code OpenCL, donc il se peut que je dise des bêtises), c'est même l'un des points majeurs d'OpenCL: faire du code portable plutôt que spécifique, tout en permettant de tirer profit du nombre de cœurs à l'exécution, de spécificités de et optimisations pour certains CPU et GPU, etc. Donc pareil, tu gères à l'exécution, pas à la compilation.
J'espère que ça aide.
Film d'animation libre en CC by-sa/Art Libre, fait avec GIMP et autre logiciels libres: ZeMarmot [ http://film.zemarmot.net ]