› Foros › Retro y descatalogado › Consolas clásicas
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.
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 */
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 .