Coder Social home page Coder Social logo

Comments (11)

ilyakurdyukov avatar ilyakurdyukov commented on September 22, 2024

На v4 нет 128-bit атомарных операций, для v5 и далее - есть, так в МЦСТ ответили и баг закрыли. Версию архитектуры можно узнать на этапе компиляции по значению макроса __iset__.

from libatomic_ops.

ivmai avatar ivmai commented on September 22, 2024

Tip for me: code of libatomic - https://github.com/OpenE2K/gcc/tree/gcc-runtime-mcst/libatomic

from libatomic_ops.

ivmai avatar ivmai commented on September 22, 2024

На v4 нет 128-bit атомарных операций, для v5 и далее - есть, так в МЦСТ ответили и баг закрыли. Версию архитектуры можно узнать на этапе компиляции по значению макроса __iset__.

Got it. Thank you! I will do a compile-time check based on the macro.

from libatomic_ops.

ivmai avatar ivmai commented on September 22, 2024

Note: there was also a suggestion to use a runtime check (`__builtin_cpu_arch()') but according to the design of libatomic_ops availability of a particular atomic operation should be detectable thru a macro.

from libatomic_ops.

ilyakurdyukov avatar ilyakurdyukov commented on September 22, 2024

И еще добавили, что в v4 есть атомарные 128-бит запись/чтение, это для указателей 128-бит режима. Но нет эквивалента exchange/compare_exchange на 128 бит.

from libatomic_ops.

ivmai avatar ivmai commented on September 22, 2024

И еще добавили, что в v4 есть атомарные 128-бит запись/чтение, это для указателей 128-бит режима. Но нет эквивалента exchange/compare_exchange на 128 бит.

О, спасибо, это понадобится когда буду добавлять поддержку ЗР в libgc.

from libatomic_ops.

ilyakurdyukov avatar ilyakurdyukov commented on September 22, 2024

Предлагают вместо __iset__ использовать проверку на макрос __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 для определения наличия интринсика в компиляторе, для Clang тоже работает.

from libatomic_ops.

ivmai avatar ivmai commented on September 22, 2024

Предлагают вместо __iset__ использовать проверку на макрос __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 для определения наличия интринсика в компиляторе, для Clang тоже работает.

I agree that about gcc your suggestion is good, but not for clang: clang -m64 -dM -E ... | grep GCC_HAVE_SYNC gives nothing.
But I will use it at least for gcc. Thank you!

from libatomic_ops.

ilyakurdyukov avatar ilyakurdyukov commented on September 22, 2024

Для Clang-9 на x86_64 это работает (https://godbolt.org/z/P7Gqoa3qM):

#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
#error
#endif

На 16 байт у x86_64 нет.

В Clang от МЦСТ интринсики вроде есть, а макроса нет. На это баг уже завели.

Но это был совет от МЦСТ с этим макросом, я бы предпочёл использовать __iset__, чем непонятные макросы от компилятора.

from libatomic_ops.

ivmai avatar ivmai commented on September 22, 2024

Для Clang-9 на x86_64 это работает (https://godbolt.org/z/P7Gqoa3qM):
На 16 байт у x86_64 нет.

Да, интринсик есть для 16 байт а макроса нет. У Clang.

from libatomic_ops.

ivmai avatar ivmai commented on September 22, 2024

В Clang от МЦСТ интринсики вроде есть, а макроса нет. На это баг уже завели.

There 2 extra issues with clang 16-byte compare and exchange (I mean difference from gcc) besides absence of the feature macro:

src/atomic_ops/sysdeps/gcc/generic.h:227:19: warning: large atomic operation may incur significant performance penalty; the access size (16 bytes) exceeds the max lock-free size (8  bytes) [-Watomic-alignment]
      return (int)__atomic_compare_exchange_n(&addr->AO_whole,
                  ^
1 warning generated.
/usr/bin/ld: /tmp/atomic_ops_stack-eb3351.o: в функции «AO_stack_pop_acquire»:
-:(.text+0x26c): неопределённая ссылка на «__atomic_compare_exchange»
/usr/bin/ld: -:(.text+0x36c): неопределённая ссылка на «__atomic_compare_exchange»
clang-13: error: linker command failed with exit code 1 (use -v to see invocation)

As a workaround this could be used by client: CFLAGS=-Wno-atomic-alignment LDFLAGS=-latomic

from libatomic_ops.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.