ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
16 апреля
1077120
klen (14.02.2021 17:35, просмотров: 2703)
атомарные операции в riscv. __atomic_test_and_set, __atomic_clear, __atomic_fetch_add, __atomic_fetch_sub и тд. понимаю что они делают но не понимаю как применить и где, тыкните в книжицу по теме. 

при ковырянии исходников кодогенератора gcc в части порта riscv нашел генерацию встроенных расширений - ну ессесено в связи с тем что gd32vf1 имет проц IMAC, буква А как бы намекает что немедленно захотелось посмотреть че де как работает и "что мы можем иметь с Гусева"

 int val = 0 ;

nop(); __atomic_test_and_set(&val, __ATOMIC_SEQ_CST); nop(); __atomic_clear(&val, __ATOMIC_SEQ_CST); nop(); __atomic_fetch_add (&val, 10, __ATOMIC_SEQ_CST); nop(); __atomic_fetch_sub (&val, -20, __ATOMIC_SEQ_CST); nop();


выход кодогенратора

08000956:   nop     
110          __atomic_test_and_set(&val, __ATOMIC_SEQ_CST);
08000958:   lui     a5,0x20000
0800095c:   addi    t0,a5,1384 # 0x20000568 

по ходу список такой:

exchange

compare

set

clear

add

sub

or

xor

and

все с немрнятными пока мне параметр memory_order

__ATOMIC_RELAXED

__ATOMIC_CONSUME

__ATOMIC_ACQUIRE

__ATOMIC_RELEASE

__ATOMIC_ACQ_REL

__ATOMIC_SEQ_CST


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

че с этим добром делают умные люди и где применяют .