Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Биты, потоки и др. / 25 сообщений из 61, страница 1 из 3
20.06.2017, 18:59
    #39475032
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Допустим, есть код, в котором один поток присваивает переменной случайные чётные значения, а другой - случайные нечётные значения. Верное ли, что если переменная типа int, использовать обёртку atomic необходимости нет, а если float или double, то надо?
Почему объекты int сравниваются между собой точно, а float или double уместно сравнивать с учётом допустимой погрешности, ведь в каждом случае достаточно сравнивать соответствующие биты?
...
Рейтинг: 0 / 0
20.06.2017, 19:45
    #39475046
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
IMHO жестокий вопрос, точнее два жестоких вопроса

1) фиолетово, что для int, что для float. double. Т.к. все пытаются только присвоить и никто не пытается ничего прочитать, то, что присваивать четные значения, что нечетные - одно фиолетово. Просто преобразование электронов в температуру воздуха в комнате, где стоит системный блок. При чем тут atomic совершенно не понятно.

2) одинаково фиолетово, если работать с float как с набором битов

Код: sql
1.
2.
3.
4.
b=a;
if (a == b ) {
  println('Hello world!');
}



будет работать вне зависимости от того, float или int. А вот математические вычисления, точно работать с плавающей точкой НЕ будут.

Код: sql
1.
2.
3.
4.
a=10 / 3 ;
if (a == 3 ) {
  println('Hello world!');
}



с int работать будет, а с float уже нет )))
...
Рейтинг: 0 / 0
20.06.2017, 20:07
    #39475053
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Leonid Kudryavtsev1) фиолетово, что для int, что для float. double. Т.к. все пытаются только присвоить и никто не пытается ничего прочитать, то, что присваивать четные значения, что нечетные - одно фиолетово. Просто преобразование электронов в температуру воздуха в комнате, где стоит системный блок. При чем тут atomic совершенно не понятно.

Хорошо, не чётные/нечётные, а значения, в последних 5 битах которых стоят единицы для первого потока (остальные биты случайны) и значения, у которых на тех же местах стоят нули для второго потока. Затем потоки прерываются. После завершения работы потоков по присвоению значений одной и той же переменной у int на последних 5 битах будут стоять только нули или только единицы (насколько я понял). У double или float тоже будут на последних 5 битах либо нули, либо только единицы?

Про сравнение: по-моему,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int main() {
    int i1 = 1; 
    int i2 = 1;
    if (i1 == i2) printf("int equal"); //правильно

    float f1 = 1f; 
    float f2 = 1f;
    if (f1 == f2) printf("float incorrect"); //неправильно
    if (abs(f1 - f2) < 0.0000001f) printf("float equal correct"); //правильно

    double d1 = 1.0; 
    double d2 = 1.0;
    if (d1 == d2) printf("double incorrect"); //неправильно
    if (abs(d1 - d2) < 0.0000001) printf("double equal correct"); //правильно

    return 0;
}



В тех строках, где неправильно (наверное) сравниваются float и double печать будет происходить не всегда. Или я ошибаюсь?
...
Рейтинг: 0 / 0
20.06.2017, 20:20
    #39475059
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvangoПосле завершения работы потоков по присвоению значений одной и той же переменной у int на последних 5 битах будут стоять только нули или только единицы (насколько я понял). У double или float тоже будут на последних 5 битах либо нули, либо только единицы?

И то и то атомарный тип процессора (intel). Почему поведение для int должно отличаться от поведения для float - лично мне совершенно не понятно

Насколько такая операция безопасна и документирована - я не знаю, не спец по процессорам и многозадачности в таком сферическом вопросе. Подозреваю, обработка все равно будет идти по cache line, т.ч. что int, что double будет глубоко пофиг. Но подозреваю, точно не знаю. Ссылку на доку дать не готов.

ayvangoпечать будет происходить не всегда. Или я ошибаюсь?
Я сильно сомневаюсь, что кто-то специально добавлял генератор случайных чисел в команду присваивания ))) Но разумеется, все зависит от разработчиков компилятора, их воображения и чувства юмора )))
...
Рейтинг: 0 / 0
20.06.2017, 20:23
    #39475062
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvango, у тебя какая-то каша в голове.

Атомарность это прочитать-изменить-записать. atomic именно это гарантирует для int/float/double и т.д., т.е. между чтением и записью исходное значение не изменилось.

Про точность float/double и почему их нельзя сравнивать на == читай гугл.
...
Рейтинг: 0 / 0
20.06.2017, 20:38
    #39475074
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Т.е., atomic нужен только для того, чтобы учесть изменения, вносимые каждым потоком (когда оба они выполняют, нампример, операцию сложения с константой). А если один поток присваивает переменной случайное значение, большее 100, а другой значение, меньшее 100, то никакие atomic не нужны?

Что тогда имеется ввиду в фразе "int - атомарный тип, а double таковым не является" ?
...
Рейтинг: 0 / 0
20.06.2017, 20:49
    #39475082
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvangoТ.е., atomic нужен только для того, чтобы учесть изменения, вносимые каждым потоком (когда оба они выполняют, нампример, операцию сложения с константой). А если один поток присваивает переменной случайное значение, большее 100, а другой значение, меньшее 100, то никакие atomic не нужны?
Если тебе пофиг что в итоге запишется то не нужны.

ayvangoЧто тогда имеется ввиду в фразе "int - атомарный тип, а double таковым не является" ?
Откуда эта фраза?
...
Рейтинг: 0 / 0
20.06.2017, 20:57
    #39475085
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Откуда эта фраза?
Наверное, что-то напутал.
Думал, что принципиальные различия у int и double имеются.
...
Рейтинг: 0 / 0
20.06.2017, 20:59
    #39475087
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvangoЧто тогда имеется ввиду в фразе "int - атомарный тип, а double таковым не является"?

Спроси у её автора. Скорее всего - отсутствие/наличие "thorn read". У Интеля его нет ни
для int ни для double (при должном выравнивании).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.06.2017, 21:14
    #39475090
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvangoОткуда эта фраза?
Наверное, что-то напутал.
Думал, что принципиальные различия у int и double имеются.
Все что укладывается в одну команду асма - атомарно. Присвоение значения int/float/double это одна команда, т.е. прерывание потока может произойти или до или после, но не в середине.
...
Рейтинг: 0 / 0
20.06.2017, 22:10
    #39475101
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Dima TВсе что укладывается в одну команду асма - атомарно. Присвоение значения int/float/double это одна команда, т.е. прерывание потока может произойти или до или после, но не в середине.
нездоровый тезис
...
Рейтинг: 0 / 0
20.06.2017, 22:13
    #39475102
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Dima TВсе что укладывается в одну команду асма - атомарно.

Всё несколько усложняется когда приходит многопроцессорность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.06.2017, 22:21
    #39475103
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvango, float, это 4 байта, double - 8 байт. Для процессора Intel совершенно фиолетово, какими типами данных оперирует компилятор C++ и он с одинаковым успехом командой "lock xchg" запишет хоть long, хоть float по указанному адресу памяти. Если не знаком с inline-ассемблером, ничто не мешает использовать WINAPI Interlocked функции, к примеру:
Код: plaintext
1.
InterlockedExchange(reinterpret_cast<long*>(&myFloat), 1);
...
Рейтинг: 0 / 0
20.06.2017, 23:15
    #39475115
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Dima TВсе что укладывается в одну команду асма - атомарно.Нет, не атомарно.
...
Рейтинг: 0 / 0
20.06.2017, 23:32
    #39475116
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Я думаю что среди нормальных овец найдется одна паршивая.
...
Рейтинг: 0 / 0
21.06.2017, 01:38
    #39475134
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
...
Рейтинг: 0 / 0
21.06.2017, 09:17
    #39475209
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ИзопропилDima TВсе что укладывается в одну команду асма - атомарно. Присвоение значения int/float/double это одна команда, т.е. прерывание потока может произойти или до или после, но не в середине.
нездоровый тезис
Я к тому что в результате одновременного вызова из нескольких потоков
Код: plaintext
1.
x = ...;


в x всегда будет значение записанное одним из потоков, а не комбинация из части байтов от одного потока и части от второго.
...
Рейтинг: 0 / 0
21.06.2017, 09:36
    #39475220
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Dima T,

про выравнивание забываешь, из-за него и может
...
Рейтинг: 0 / 0
21.06.2017, 10:12
    #39475253
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Dima TЯ к тому что в результате одновременного вызова из нескольких потоков
Код: plaintext
1.
x = ...;

в x всегда будет значение записанное одним из потоков, а не комбинация из части байтов от одного потока и части от второго.Нет! Там всегда будет то значение, которое каким-либо образом попало в кэш обратной (отложенной) записи ядра процессора. В данном случае, там будет значение, записанное ядром в свой собственный кэш.
В реальности всё гораздо сложнее - система кэширования процессора оперирует блоками отображения на память. Величина блока -
величина не константная и зависит от модели процессора. На время выполнении операции чтения/записи с памятью, системная шина блокируется и данные из кэша ядра синхронизируется с памятью, что обеспечивает атомарность переноса данных из кэша в память и обратно.
MFENCE and LFENCE Micro-Architectural Implementation Method and System
...
Рейтинг: 0 / 0
21.06.2017, 11:28
    #39475319
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvangoПочему объекты int сравниваются между собой точно, а float или double уместно сравнивать с учётом допустимой погрешности, ведь в каждом случае достаточно сравнивать соответствующие биты?


...
Рейтинг: 0 / 0
21.06.2017, 23:13
    #39475821
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
в огороде бузина, а в Киеве - дядька...
ты хотя бы определился бы, о каком языке программирования речь...


ayvangoДопустим, есть код, в котором один поток присваивает переменной случайные чётные значения, а другой - случайные нечётные значения. Верное ли, что если переменная типа int, использовать обёртку atomic необходимости нет, а если float или double, то надо?



скорей всего, , неверно.



ayvangoПочему объекты int сравниваются между собой точно, а float или double уместно сравнивать с учётом допустимой погрешности, ведь в каждом случае достаточно сравнивать соответствующие биты?


это совсем другая история. int точный тип данных, а float , double - неточные, их в принципе
сравнивать бессмысленно.
...
Рейтинг: 0 / 0
22.06.2017, 07:37
    #39475922
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
MasterZivayvango....ведь в каждом случае достаточно сравнивать соответствующие биты?

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

если о хранение данных, то что int, что float/double одинаковые последовательности битиков и никто не мешает их сравнивать

если о вычислениях, то тогда float/double точно сравнивать обычно бессмысленно

Видел одну систему, где Primary Key в БД был float. Наверное, в случае Primary Key, сравнивать "с учетом допустимой погрешности" как-то странно. Другое дело, что я хотел бы видеть того архитектора и анал итика который Primary Key сделал float'ом и зачем он это сделал так. Даже на hibernate головного мозга это не списать. Там какое-то другое заболевание. Система была на Delphi написана.
...
Рейтинг: 0 / 0
23.06.2017, 01:24
    #39476503
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
если о вычислениях, то тогда float/double точно сравнивать обычно бессмысленно
Именно это я и спрашивал: почему бессмысленно.
Чтобы не плодить темы о потоках: отличается ли чем-то принципиально многопоточное программирование от многопроцессного, кроме разных механизмов синхронизации?
...
Рейтинг: 0 / 0
23.06.2017, 07:37
    #39476525
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
ayvangoЧтобы не плодить темы о потоках: отличается ли чем-то принципиально многопоточное программирование от многопроцессного, кроме разных механизмов синхронизации?
Отличаются. Каждый процесс имеет свое адресное пространство, поэтому указатель между процессами не передать.
...
Рейтинг: 0 / 0
23.06.2017, 10:53
    #39476626
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Биты, потоки и др.
Отличаются. Каждый процесс имеет свое адресное пространство, поэтому указатель между процессами не передать.
Только этим отличаются?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Биты, потоки и др. / 25 сообщений из 61, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]