La différence entre amd64 et i386 est que amd64 est à 64 bits alors que i386 est à 32 bits . C'est la largeur (en bits) des registres disponibles dans le noyau.
Fondamentalement, le plus grand nombre qu'un cœur de processeur 32 bits peut gérer en une fois dépasse un peu plus de 4,29 milliards de dollars, tandis qu'un cœur de 64 bits peut gérer un nombre légèrement supérieur à 18,44 milliards de milliards.
Les cœurs des ordinateurs modernes sont capables de se comporter comme un processeur 64 bits ou 32 bits en fonction de la version du système d'exploitation que vous avez installée.
Le code 64 bits a tendance à être plus rapide que le code 32 bits, soit parce qu'il peut traiter des nombres plus importants à la volée, soit parce que les cœurs 64 bits ont plus de registres, ce qui permet de stocker davantage d'éléments sans avoir à les stocker dans la mémoire externe. Bien que rien ne garantisse que le code 64 bits fonctionnera plus rapidement si le code n'a pas été écrit pour tirer parti des fonctionnalités supplémentaires du processeur.
La compilation sur un système 32 bits produira un code différent de celui d'un système 64 bits. Vous pouvez le prouver en compilant en code assembleur sur les deux systèmes. En supposant que votre fichier C est myfile.c, essayez gcc -S myfile.c
sur les deux systèmes et comparez myfile.s
Un code bien écrit pour un système 32 bits doit être compilé et exécuté sur un système 64 bits, mais tout le code n'est pas bien écrit. De nombreux programmeurs font des hypothèses sur le système qui peuvent ne pas être vraies: telles que la largeur du registre ou l'ordre des octets.
Sans accès à votre code source, il est difficile de voir quel est le problème, mais un segmenation fault
indique qu'une tentative d'accès à une mémoire n'appartenant pas au programme a été effectuée. Cela peut, par exemple, indiquer que mem_ptr est un pointeur 32 bits, ce qui convient parfaitement à un système 32 bits mais doit être un pointeur 64 bits sur un système 64 bits.