La diferencia entre amd64 e i386 es que amd64 es de 64 bits, mientras que i386 es de 32 bits . Este es el ancho (en bits) de los registros disponibles en el núcleo.
Básicamente, el número más grande que un núcleo de CPU de 32 bits puede manejar de una vez es un poco más de 4.29 mil millones, mientras que un núcleo de 64 bits puede manejar un número de más de 18.44 mil millones, mil millones.
Los núcleos de las PC modernas son capaces de comportarse como un procesador de 64 bits o de 32 bits, según la versión del sistema operativo que haya instalado.
El código de 64 bits tiende a ejecutarse más rápido que el código de 32 bits ya sea porque puede manejar números más grandes en marcha o porque los núcleos de 64 bits tienen más registros, por lo que pueden almacenar más cosas sin necesidad de poner cosas en la memoria externa. Aunque no hay garantía de que el código de 64 bits se ejecutará más rápido si el código no se ha escrito para aprovechar las características adicionales del procesador.
Compilar en un sistema de 32 bits producirá un código diferente al de un sistema de 64 bits. Puede probar esto compilando el código de ensamblaje en los dos sistemas. Suponiendo que su archivo C es myfile.c intente gcc -S myfile.c
en ambos sistemas y compare myfile.s
El código bien escrito para un sistema de 32 bits debe compilarse y ejecutarse en un sistema de 64 bits, pero no todo el código está bien escrito. Muchos programadores hacen suposiciones sobre el sistema que pueden no ser ciertas: como el ancho del registro o el orden de los bytes.
Sin acceso a su código fuente, es difícil ver cuál es el problema, pero segmenation fault
indica que se ha intentado acceder a la memoria que no pertenece al programa. Esto puede, por ejemplo, indicar que mem_ptr es un puntero de 32 bits que está bien en un sistema de 32 bits pero que debe ser un puntero de 64 bits en un sistema de 64 bits.