¿Existen mames que aprovechen los multinucleos?

Hola a tod@s

Pues eso, estoy a ver si instalo el windows 7 y omo parece que aprovecha los multinucleos queria saber si hay un mame que los aproveche tambien. Si es que si donde puedo pillarlo? Es que no veo nada en su página oficial.

Gracias:)
Does MAME benefit from SMP (symmetric multiprocessing) / HT (Hyper-Threading) / dual cores?

Recent versions of MAME include a -mt switch which allows some tasks to be threaded off for use by SMP or multicore systems. Thus far the benefits from this are relatively small, because accurate emulation such as MAME strives for cannot easily be broken up into parallel subtasks (it would be like trying to have a baby in one month by impregnating nine women). There are exceptions of course, and MAME will support them via this mechanism in the future.


http://mamedev.org/devwiki/index.php/FA ... l_cores.3F

Parece que el tener un procesador con HT o Doble nucleo no ayuda mucho.
Yo uso MameUI en edicion 64 bits si te sirve de algo n_nU
68000 escribió:Does MAME benefit from SMP (symmetric multiprocessing) / HT (Hyper-Threading) / dual cores?

Recent versions of MAME include a -mt switch which allows some tasks to be threaded off for use by SMP or multicore systems. Thus far the benefits from this are relatively small, because accurate emulation such as MAME strives for cannot easily be broken up into parallel subtasks (it would be like trying to have a baby in one month by impregnating nine women). There are exceptions of course, and MAME will support them via this mechanism in the future.


http://mamedev.org/devwiki/index.php/FA ... l_cores.3F

Parece que el tener un procesador con HT o Doble nucleo no ayuda mucho.


Traducción: No cuentes con ello. Le pasa algo parecido al tema de la emulación 3D, no es su problema si va lento o si avanza la tecnología. Aparte, debería de encargarse de implementarlo casi por cada sistema emulado. Meter varios hilos de ejecución en una cpu que sea usada por 10 sistemas puede generar que 2 funcionen bien y 5 mal.
Pues yo pensaria que seria mas facil... tocará esperar.
Es que la emulación, asi a priori es algo que no se paraleliza fácilmente.

Por ejemplo:

arm.c escribió:static int arm_execute( int cycles )
{
data32_t pc;
data32_t insn;

arm_icount = cycles;
do
{

#ifdef MAME_DEBUG
if (mame_debug)
MAME_Debug();
#endif

/* load instruction */
pc = R15;
insn = READ32( pc & ADDRESS_MASK );

switch (insn >> INSN_COND_SHIFT)
{
case COND_EQ:
if (Z_IS_CLEAR(pc)) goto L_Next;
break;
case COND_NE:
if (Z_IS_SET(pc)) goto L_Next;
break;
case COND_CS:
if (C_IS_CLEAR(pc)) goto L_Next;
break;
case COND_CC:
if (C_IS_SET(pc)) goto L_Next;
break;
case COND_MI:
if (N_IS_CLEAR(pc)) goto L_Next;
break;
case COND_PL:
if (N_IS_SET(pc)) goto L_Next;
break;
case COND_VS:
if (V_IS_CLEAR(pc)) goto L_Next;
break;
case COND_VC:
if (V_IS_SET(pc)) goto L_Next;
break;
case COND_HI:
if (C_IS_CLEAR(pc) || Z_IS_SET(pc)) goto L_Next;
break;
case COND_LS:
if (C_IS_SET(pc) && Z_IS_CLEAR(pc)) goto L_Next;
break;
case COND_GE:
if (!(pc & N_MASK) != !(pc & V_MASK)) goto L_Next; /* Use x ^ (x >> ...) method */
break;
case COND_LT:
if (!(pc & N_MASK) == !(pc & V_MASK)) goto L_Next;
break;
case COND_GT:
if (Z_IS_SET(pc) || (!(pc & N_MASK) != !(pc & V_MASK))) goto L_Next;
break;
case COND_LE:
if (Z_IS_CLEAR(pc) && (!(pc & N_MASK) == !(pc & V_MASK))) goto L_Next;
break;
case COND_NV:
goto L_Next;
}
/* Condition satisfied, so decode the instruction */
if ((insn & 0x0fc000f0u) == 0x00000090u) /* Multiplication */
{
HandleMul(insn);
R15 += 4;
}
else if (!(insn & 0x0c000000u)) /* Data processing */
{
HandleALU(insn);
}
else if ((insn & 0x0c000000u) == 0x04000000u) /* Single data access */
{
HandleMemSingle(insn);
R15 += 4;
}
else if ((insn & 0x0e000000u) == 0x08000000u ) /* Block data access */
{
HandleMemBlock(insn);
R15 += 4;
}
else if ((insn & 0x0e000000u) == 0x0a000000u) /* Branch */
{
HandleBranch(insn);
}
else if ((insn & 0x0f000000u) == 0x0f000000u) /* Software interrupt */
{
pc=R15+4;
R15 = eARM_MODE_SVC; /* Set SVC mode so PC is saved to correct R14 bank */
SetRegister( 14, pc ); /* save PC */
R15 = (pc&PSR_MASK)|0x8|eARM_MODE_SVC|(pc&MODE_MASK);
}
else /* Undefined */
{
logerror("%08x: Undefined instruction\n",R15);
L_Next:
arm_icount -= S_CYCLE;
R15 += 4;
}

arm_icount -= 3;
} while( arm_icount > 0 );

return cycles - arm_icount;
} /* arm_execute */


La mayoría del código es de este modo,toca evaluar condición tras condición la mayoría de las veces con fuertes dependencias, no puedes ejecutar las instrucciones a destiempo con la excusa de paralelizar, serían todo resultados incorrectos.

Puede que haya casos en los que si se pueda paralelizar, por ejemplo una rasterización de un chip 3d, un core hace una parte de la pantalla y otro core hace otra o un dsp para audio, pero lo que es la lógica del control es una tarea netamente iterativa no paralelizable.
Uno de los problemas creo que es el la forma en la que se plantea la emulación. Quizá una paralelización a pelo es imposible, pero una segmentación podría dar mejores resultados, intentando acercar la interpretación de las instrucciones a un cauce segmentado. No creo que sea muy viable, ya que a menos que se puedan encontrar bloques de instrucciones independientes seguramente sea peor el remedio que la enfermendad.

Otra opción que supongo que seguirán en MAME sería paralelizar las ejecuciones de las cpus, es decir, que el chip de sonido se ejecute en paralelo con la cpu, esperando a que le lleguen datos. No se, son suposiciones, pero también hay que contar con que MAME es un cristo. En mi opinión, cualquier optimización sería viable únicamente en proyectos más pequeños .
nuvalo escribió:Uno de los problemas creo que es el la forma en la que se plantea la emulación. Quizá una paralelización a pelo es imposible, pero una segmentación podría dar mejores resultados, intentando acercar la interpretación de las instrucciones a un cauce segmentado. No creo que sea muy viable, ya que a menos que se puedan encontrar bloques de instrucciones independientes seguramente sea peor el remedio que la enfermendad.

Otra opción que supongo que seguirán en MAME sería paralelizar las ejecuciones de las cpus, es decir, que el chip de sonido se ejecute en paralelo con la cpu, esperando a que le lleguen datos. No se, son suposiciones, pero también hay que contar con que MAME es un cristo. En mi opinión, cualquier optimización sería viable únicamente en proyectos más pequeños .


Bueno lo de los bloques de instrucciones es una vieja idea que se ha usado en los dynarec y si se aumenta el rendimiento, pero a costa de hacer menos exacta la emulación además de también puede crear problemas con código que se automodifica, como todo al final es un juego de sacrificios.

Sobre emular chips completos en un core hace tiempo leí a R.Belmont o Haze o alguno de estos del mame team que para chips como por ejemplo el z80 que llevan muchas placas para controlar un chip de sonido, al final no se ganaba el suficiente rendimiento como para justificar esa arquitectura además de complicar más aún el código de mame.

Esto como has comentado posiblemente lo veamos en otros emuladores que no sean mame, ya que como todo el mundo sabe poder jugar es un efecto secundario a simular el hardware según el mame team.
creo que llego a salir una version por ahi optimizada
Hombre, hace muucho salio el mameplus que hacia uso de los juegos de instrucciones SSE2, SSE3, 3Dnow... Es una optimizacion pero tambien es otra historia distinta, hablamos de programacion concurrente, de segmentar el codigo y que cada hilo de ejecucion sea procesado por un nucleo distinto para un objetivo comun
no llego a saliar una version que era mame64 ?
10 respuestas