2012-09-23 22 views
5

¿Puedo crear un binario universal para Mac OS X que contenga dos versiones de mi aplicación, una que esté compilada con SSE4.2 y otra compilada con SSE3?binario universal para diferentes versiones de SSE

En este caso, la versión compilada con SSE4.2 se cargará automáticamente para la CPU que admita SSE4.2.

Si no, me gustaría obtener sugerencias para ejecutar mi aplicación en CPUs antiguas que no son compatibles con SSE4.2 pero utilizan SSE4.2 en la CPU que lo admiten.

Tenga en cuenta que me dirijo a Mac AppStore, si ese es el caso. Uso Clang con Xcode 4.5.

+0

Todo lo que necesita hacer es: 1) Detectar el conjunto de instrucciones. 2) Sucurge a la versión que quieras. – Mysticial

+0

[Mi respuesta aquí muestra cómo detectar el conjunto de instrucciones.] (Http://stackoverflow.com/a/7495023/922184) El intrínseco '__cpuid()' es específico de MSVC. En GCC, puede acceder utilizando el ensamblaje en línea. Aunque no estoy seguro de lo que estás usando, pero debería haber una forma de acceder a él. – Mysticial

+0

Prefiero no cambiar los archivos de código fuente ya que algunas de las líneas que no se ejecutan en CPUs antiguas provienen de proyectos de código abierto de terceros. –

Respuesta

3

Esto no es compatible con el formato Mach-O, que es utilizado por Mac OS X. El formato permite binarios para diferentes arquitecturas. Hay un campo de subtipo, pero solo hay valores definidos para diferentes generaciones de procesadores, no sus capacidades.

Hay un par de formas de evitar esto. Uno sería tener tanto SSE4.2 como el código para procesadores antiguos integrados en el mismo binario, usando diferentes nombres de funciones. Su código determinará si SSE4.2 es compatible o no, luego llama a la función adecuada.

Otra opción sería crear dos bibliotecas, una con SSE4.2 y otra sin ella, y enviarlas a ambas en su paquete de aplicaciones, pero no enlazarlas. Cuando se carga por primera vez, su código determinará si SSE4.2 es compatible o no y luego cargará la biblioteca correcta.

Utilizando el primer método, no tiene que preocuparse por cargar una biblioteca y conectar todas las funciones, pero siempre cargará un código adicional que no se ejecutará, y deberá verificar una variable antes de cada de esas llamadas de función. Usando el segundo método, simplemente puede llamar a las funciones sin verificar nada en todo momento, pero cargar la biblioteca y conectar todas las funciones es más trabajo que simplemente comparar una variable cada vez.

Cuestiones relacionadas