LINUX.ORG.RU

Ответ на: комментарий от Iron_Bug

Можно поподробнее? А так оно не зря просирается? Я недостаточно хорошо себе представляю происходящее. На SO писали, что пауза отключала оптимизации конвейера, тоже недопонял.

dimgel ★★★ ()

Eh... Заставил скачать и посмотреть.

ENTRY(pthread_spin_lock)
1:      LOCK
        decl    0(%rdi)
        jne     2f
        xor     %eax, %eax
        ret

        .align  16
2:      rep
        nop
        cmpl    $0, 0(%rdi)
        jg      1b
        jmp     2b
END(pthread_spin_lock)

pause - это алиас для rep nop.

mv ★★★★★ ()

asm-инструкция pause

Залез в википедию и узнал, что существует такая инструкция для x86, опкод которой совпадает c «rep nop» - F3 90. Написано, что появился (задокументировали поведение?) вместе с sse2 инструкциями.

anonymous ()

почему ты не доверяешь в этом вопросе производителю процессора?

The PAUSE instruction provides a hint to the processor that the code sequence is a spin-wait loop. The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance.

anonymous ()
Ответ на: комментарий от anonymous

позаботились об обратной совместимости

И где задокументировано (для обратной совместимости), что префикс REP сочетается с NOP и вообще с другими не «строковыми инструкциями»?

anonymous ()
Ответ на: комментарий от Iron_Bug

он разрешает хардварные прерывания, особенно на RISC-процессорах. ну и компилятор не выбросит твой код, как «ненужный».

а где тут RICS? это команда конкретно интеловской архитектуры. а причем тут прерывания(произвольное разрешение прерываний это не хухры мухры, если их запретили, то по делу).

pause похоже запрещает спекулятивное исполнение команд, поскольку в данном случае оно не нужно, избыточно. тут надо честно проверять переменную в памяти, ожидая когда она изменит значение. а не спекулировать исполнение, думая что она не изменяется. на такую спекуляцию тратится энергия и ресурсы, а толку с нее нет.

alysnix ()
Ответ на: комментарий от alysnix

какие команды? ТС не привёл ничего вообще. pause ничего не запрещает. это просто пустая команда. либо чтобы не гонять проц зря без прихода события, либо, на некоторых архитектурах, чтобы было время это самое событие обработать. смотря как написан код.

Iron_Bug ★★★★ ()

Преданья старины глубокой.

Improves the performance of spin-wait loops. When executing a «spin-wait loop,» a Pentium 4 or Intel Xeon processor suffers a severe performance penalty when exiting the loop because it detects a possible memory order violation. The PAUSE instruction provides a hint to the processor that the code sequence is a spin-wait loop. The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance. For this reason, it is recommended that a PAUSE instruction be placed in all spin-wait loops.

An additional function of the PAUSE instruction is to reduce the power consumed by a Pentium 4 processor while executing a spin loop. The Pentium 4 processor can execute a spinwait loop extremely quickly, causing the processor to consume a lot of power while it waits for the resource it is spinning on to become available. Inserting a pause instruction in a spinwait loop greatly reduces the processor's power consumption.

This instruction was introduced in the Pentium 4 processors, but is backward compatible with all IA-32 processors. In earlier IA-32 processors, the PAUSE instruction operates like a NOP instruction. The Pentium 4 and Intel Xeon processors implement the PAUSE instruction as a pre-defined delay. The delay is finite and can be zero for some processors. This instruction does not change the architectural state of the processor (that is, it performs essentially a delaying noop operation).

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

проц со спекулятивным исполнением, начинает исполнять будущие команды, на основе текущего контекста. текущий контекст в спинлоке таков, что по адресу в памяти лежит какая-то константа. причем она не меняется в данном коде, а меняется снаружи. спекулятор думает что она не меняется вообще,и засирает конвейер по сути неверным предположением. то есть если он выполнит спекулированную команду, он не выйдет из цикла, то есть ему и выполнять ее грех. чтобы выйти из цикла, он должен выполнять не спекулированные команды, а честно тестить память, идеально с некоторой задержкой, чтобы не молотить постоянно.

вот тут абзац - из интела

The approach we recommend in such an algorithm is akin to a more gradual back off. First, we allow the thread to spin on the lock for a brief period of time, but instead of fully spinning, we use the pause instruction in the loop. Introduced with the Intel® Streaming SIMD Extensions 2 (Intel® SSE2) instruction set, the pause instruction gives a hint to the processor that the calling thread is in a «spin-wait» loop. In addition, the pause instruction is a no-op when used on x86 architectures that do not support Intel SSE2, meaning it will still execute without doing anything or raising a fault. While this means older x86 architectures that don’t support Intel SSE2 won’t see the benefits of the pause, it also means that you can keep one straightforward code path that works across the board.

Essentially, the pause instruction delays the next instruction’s execution for a finite period of time. By delaying the execution of the next instruction, the processor is not under demand, and parts of the pipeline are no longer being used, which in turn reduces the power consumed by the processor

alysnix ()
Ответ на: комментарий от alysnix

@devzero, @alysnix – спасибо за подробную инфу. Но это не отвечает на мой исходный вопрос: почему этой инструкции нет в pthread_spin_lock(), и стоит ли попробовать запилить свою собственную реализацию с ею и сравнить эффективность.

dimgel ★★★ ()