Même si gcc est très bon pour ce genre de choses, les motifs qu'il est capable de paralléliser restent très limités, et bien souvent il suffit qu'il y ait un pointeur qui traine pour tout foutre en l'air. Dans la pratique, écrire du code que gcc peut paralléliser est souvent au moins aussi complexe que d'écrire directement le code parallèle avec les intrinsics. Et le plus embêtant c'est que la moindre petite modification anodine peut rendre le code non parallélisable, donc un patch par quelqu'un qui ne fait pas super gaffe peut-être catastrophique.
Le compilateur Lisaac a accès à une sémantique très "bas niveau" des calculs à effectuer, car les nombres sont tous des objets, et les opérateurs sont tous des messages classiques d'objets, à part les quelques primitives ( - , / , * , << ).
Comme les boucles sont elles mêmes déroulées de manière complète dans le langage très minimaliste en interne du compilateur, détecter des patterns de calculs afin de les optimiser au poil pour que GCC autovectorise, n'est pas insurmontable.
De plus, comme les boucles sont très uniformes de par le fait qu'elles sont définies en librairie, il est facile de les détecter et de cracher du C autovectorisable.
En C, ecrire du code autovectorisable est très difficile, mais pour un langage où le modèle est uniforme et assez minimaliste (c'est donc valable pour quelques langages), la simplicité fait que les patterns reviennent toujours au même et que leur détection en est ainsi facilitée.
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: Surprise
Posté par Ontologia (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Le compilateur Lisaac a accès à une sémantique très "bas niveau" des calculs à effectuer, car les nombres sont tous des objets, et les opérateurs sont tous des messages classiques d'objets, à part les quelques primitives ( - , / , * , << ).
Comme les boucles sont elles mêmes déroulées de manière complète dans le langage très minimaliste en interne du compilateur, détecter des patterns de calculs afin de les optimiser au poil pour que GCC autovectorise, n'est pas insurmontable.
De plus, comme les boucles sont très uniformes de par le fait qu'elles sont définies en librairie, il est facile de les détecter et de cracher du C autovectorisable.
En C, ecrire du code autovectorisable est très difficile, mais pour un langage où le modèle est uniforme et assez minimaliste (c'est donc valable pour quelques langages), la simplicité fait que les patterns reviennent toujours au même et que leur détection en est ainsi facilitée.
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker