Ada_Ru форум

Обсуждение языка Ада

Atomic vs. out-of-order

Оставить новое сообщение

Сообщения

Иван Левашев
Atomic vs. out-of-order
2009-10-12 07:28:38

Vasiliy Fofanov writes:

 

 

В документации, например, здесь: [] этот вопрос не освещён.

 

Эта возможность недокументирована насколько знаю

намеренно. Правильное

использование билтинов компилятора ожидается в

основном от специалиста

по бэкенду, а не от обычного пользователя.

 

 

Если в документации по Си (GCC) это описано, а в документации

по Аде — нет, то как выглядит Ада в этом случае? Выглядит так,

как будто все радости жизни обходят Аду стороной. И Ада в

составе GCC выглядит не фасадом, а пристройкой.

 

Это не самая большая проблема документации по GNAT, где–то

попадались утверждения, относящиеся только к Ada 95, но не к

Ada 2005. Специально только не надо «не документировать».

Пожалуйста.

 

GCC Intrinsics — это лучше, чем ассемблерные вставки, для

обычного пользователя.

 

Раньше. Работы продолжались просто довольно долго.

Полная поддержка -

действительно апрель 2008, но частичная поддержка

была много раньше,

еще на третьем бэкенде, частичная поддержка для gcc 4 - в 2006

году. Собственно "F" в порядковом номере это 2006 год как раз.

 

В чём разница между полной и частичной поддержкой? Стоит ли для

2006го оставлять вариант на Ассемблере?

 

 

Я убеждён, что компилятор должен для Atomic генерить

барьеры памяти.

 

На чем основано ваше убеждение? Вам же указали уже что

стандарт ничего

такого не требует, так кому он это должен?

 

 

Извиняюсь, упустил из виду:

 

http://adaic.org/standards/05rm/html/RM-C-6.html

 

Two actions are sequential (see 9.10) if each is the read or

update of the same atomic object.

 

The same atomic object. А два разных атомарных объекта, видимо,

не обязаны изменяться последовательно. Но если они не обязаны,

то почему тогда в AARM:

 

http://adaic.org/standards/05aarm/html/AA-C-6.html

 

Написано:

 

The rule above and the definition of external effect are

intended to prevent (at least) the following incorrect

optimizations, where V is a volatile variable:

 

* Reordering of loads from volatile variables:

X:= V1; Y:= V2; (whether or not V1 = V2) should not

translate to Y:= V2; X:= V1;

 

* Reordering of stores to volatile variables: V1:= X;

V2:= X; should not translate to V2:=X; V1:= X;

 

В чём смысл запрещать переупорядочивание в компиляторе,

если это по–прежнему может сделать процессор?

 

Я налабал небольшой этюд, в котором, по идее, должно

сработать переупорядочивание:

 

with Ada.Text_IO; use Ada.Text_IO;

 

procedure Test_Proc is

 

Haystack : array (1 .. 2_000_000) of Integer :=

(others => 8);

X1 : Integer := 0;

pragma Atomic (X1);

X2 : Integer := 0;

pragma Atomic (X2);

 

task Changer is

entry Start;

end Changer;

 

task body Changer is

begin

accept Start;

delay 1.0;

X1 := Haystack (081_034);

X2 := 1;

end Changer;

 

begin

Changer.Start;

while X2 /= 1 loop

null;

end loop;

Put_Line (Integer'Image (X1));

end Test_Proc;

 

Теретически, Haystack (081_034) должен быть где–то вне

кеша CPU, и обращение к нему на порядки дольше, чем

immediate. Так или иначе, присваивание 1 в X2 должно

случиться раньше, чем присваивание 8 в X1. На своей

однопроцессорной виртуальной машине и на однопроцессорных

рабочих я наблюдал только результат 8.

 

На двухъядерной должны проскакивать нолики. Если я

ничего не упустил.

 

http://narod.ru/disk/14991085000/try_violate.zip.html

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти