Estoy tratando de compilar un código para arm (v7a), que tenía un
#if defined(__arm__) __yield(); #endifagregado en esta solicitud de extracción
Las otras ramas tienen YieldProcessor() para MSC y _mm_pause() o __builtin_ia32_pause() para x86 y x86-64.
El compilador no encuentra el símbolo __yield , un arm-v7a-linux-gnueabihf-gcc 7.3.1 con -mcpu=cortex-a9 -mtune=cortex-a9 -march=armv7-a . ¿Este símbolo está definido en otras plataformas ARM, más tarde en Gcc o Clang?
En los encabezados que vienen con el compilador, todo lo que pude encontrar es __gnu_parallel::__yield siendo un contenedor en línea sobre sched_yield() , que supongo que es equivalente al std::this_thread::yield() que llama el código después de 100 iteraciones llamando __yield() . Entonces creo que no es eso. Pero tampoco vi __yield en la documentación de gcc.
El intrínseco __yield se especifica como parte de las extensiones de lenguaje ARM C (consulte 8.4 "Sugerencias"). Emite la instrucción yield , que es el equivalente aproximado de la pause x86. Está pensado precisamente para situaciones como esperar en un spinlock; evita que la CPU golpee excesivamente la línea de caché (lo que perjudica el rendimiento), posiblemente ahorra algo de energía y, en el caso de una CPU con hiperprocesamiento, hace que más unidades computacionales estén disponibles para el otro procesador lógico.
(Tenga en cuenta que es puramente una función de la CPU, y no una llamada del sistema operativo o de la biblioteca; no proporciona un intervalo de tiempo de la CPU al sistema operativo como el llamado pause() o sched_yield() o std::this_thread::yield() las llamadas servirían.)
Aunque GCC es compatible con algunos de los intrínsecos de ACLE, parece que falta este. Debería poder sustituirlo por asm volatile("yield"); . La instrucción yield no tiene ningún efecto arquitectónico (se ejecuta como nop ), por lo que no se necesitan registros ni golpes de memoria.