Je suis en train de courir un algorithme qui prend du temps avec le programme bare-metal (sans OS) sur notre carte en utilisant un processeur (architecture sparc) développé en notre équipe, et en utilisant gcc elf toolchain. Avec soft-float, ça marche bien, et j'obtiens le résultat désiré après plus d'une heure (c'est purement logiciel, ça sera beaucoup plus court avec du matériel spécial plus tard). Mais en utilisant hard-float, je peux le faire en 15 minutes, bon résultat. OK, mais dans une certaine configuration de cas hard-float, je vois que la fonction exp() ne fonctionne pas correctement. Ce cas est où je veux imprimer float correctement.Dans elf-gcc, exp() fonctionne correctement seulement pour le premier appel que pas après
J'ai écrit un code de test pour tester la fonction exp(),
ab_printf("------- exp test--------\n");
float a[5] = {-0.438984, -0.357934, 0.174203, 0.280720, 0.372380};
for(i=0;i<5;i++){
ab_printf("x = %f, y = %f\n", a[i], 1./(1.+exp(-1.*a[i])));
}
ab_printf("------- end of exp test--------\n");
Lorsque j'utilise Softfloat (avec -msoft flottant dans le Makefile), j'obtenir le bon résultat.
------- exp test--------
x = -0.438984, y = 0.391983
x = -0.357934, y = 0.411460
x = 0.174203, y = 0.543441
x = 0.280720, y = 0.569723
x = 0.372380, y = 0.592034
------- end of exp test--------
Ensuite, je passe à flotteur dur (en utilisant du matériel FPU, = supprimer -msoft-flotteur pour générer des instructions de flotteur de matériel), mais je comprends la fonction exp() est mis en œuvre par l'ensemble d'outils en utilisant le logiciel. (il n'y a pas d'instruction exp dans la CPU, donc la bibliothèque de la chaîne d'outils utilisera l'extension Taylor ou quelque chose comme ça ..). J'utilise deux bibliothèques comme ci-dessous pour linker lors de l'utilisation de hard-float.
LIBS += -L/opt/abde/lib/gcc/sparc-ab-elf/4.6.2/soft/v8 # line 1
LIBS += -L/opt/abde/sparc-ab-elf/lib/soft/v8 # line 2
Si je v8 au lieu de doux/v8 dans la ligne 1, arrête le programme lors de l'impression numéro de flotteur de sorte que n'est pas une option. Je soupçonne que mon ensemble d'outils n'a pas été construit correctement, mais je ne peux pas le construire dans mon système pour le moment.
Si j'utilise v8 au lieu de soft/v8 dans la ligne 2, je vois des données brouillées pour le nombre flottant. Mais je sais que je peux obtenir un bon résultat de détection dans cette configuration, même si je vois quelques petites erreurs flottantes se développer au fur et à mesure du traitement, et je sais que dans cette configuration, exp() fonctionne aussi (15 minutes) .
En mode disque flottant, quand je lance de i = 0, il me donne ce résultat (seul le premier a travaillé correct):
------- exp test--------
x = -0.438984, y = 0.391983
x = -0.357934, y = 1.000000
x = 0.174203, y = 1.000000
x = 0.280720, y = 1.000000
x = 0.372380, y = 1.000000
------- end of exp test--------
quand je le lance de I = 1, il me donne (aussi, seulement le premier correct)
------- exp test--------
x = -0.357934, y = 0.411460
x = 0.174203, y = 1.000000
x = 0.280720, y = 1.000000
x = 0.372380, y = 1.000000
------- end of exp test--------
Quel cas cela serait-il? Le problème est que je ne peux pas construire la chaîne d'outils en ce moment sur mon système.
Une possibilité est que quelque chose dans le traitement ab_printf gâche le flottant matériel. Pour tester cette théorie, vous pouvez stocker les résultats dans un tableau de la boucle et les sortir uniquement d'une boucle ultérieure. –
c'est une bonne idée, j'ai essayé mais ce n'était pas le cas. Merci! –
Vous obtenez des résultats erronés pour d'autres fonctions 'math.h', comme' sin', 'atan', etc., ou le problème est-il spécifique à' exp'? Il serait bon d'éliminer également les problèmes 'printf', étant donné que le code convertissant un flottant en nombre décimal pour la sortie peut être nettement plus compliqué que le code exécutant' exp'. –