Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

319
Views
¿Hay un __yield() intrínseco en Arm?

Estoy tratando de compilar un código para arm (v7a), que tenía un

 #if defined(__arm__) __yield(); #endif

agregado 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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!