[sisyphus] Странности при переходе объединении двух целых в вещественное на x86_64

Roman Savochenko rom_as на diyaorg.dp.ua
Пт Авг 7 11:14:41 MSD 2009


Kirill A. Shutemov wrote:
> 2009/8/7 Roman Savochenko <rom_as на diyaorg.dp.ua>:
>   
>> Kirill A. Shutemov wrote:
>>     
>>>> Имеется некая целевая задачка собрать из двух 16-разрядных целых
>>>> вещественное (float), 32 разряда.
>>>> Казалось-бы тривиальная задача, которая решается кодом типа
>>>> int w1 = 62915, w2 = 16456;
>>>> ui32 vl = ((w2&0xffff)<<16) | w1&0xffff;
>>>> //sleep(1);
>>>> printf("TEST 00: %f\n",*(float*)&vl);
>>>>
>>>> И как ожидалось на x86_32 он работает корректно при различной нагрузке.
>>>> А вот на x86_64 замечается ситуация когда вместо 3.14 получаем ноль.
>>>> Причём в тестовой программке с единственным потоком всё работает
>>>> нормально,
>>>> а на высоконагруженном процессе с десятками потоков, из которых около
>>>> пяти
>>>> работают с периодом 5мс. устойчиво получатся 0.
>>>> Если раскомментирую sleep, то получаю номальный результат 3.14.
>>>>
>>>> Кто нибуть может такое поведение объяснить?
>>>>
>>>>         
>>> Похоже, вы нарушили strict aliasing. Попробуйте собрать с
>>> -Wstrict-aliasing=2.
>>> Если будет ругаться, то это наверно оно(см. оговорку в мане насчёт этой
>>> опции).
>>>       
In file included from statfunc.cpp:25:
sysfnc.h:401: warning: floating constant exceeds range of ‘double’
sysfnc.h: In member function ‘virtual void 
FLibSYS::floatSplitWord::calc(TValFunc*)’:
sysfnc.h:994: warning: dereferencing type-punned pointer will break 
strict-aliasing rules
sysfnc.h:995: warning: dereferencing type-punned pointer will break 
strict-aliasing rules
sysfnc.h: In member function ‘virtual void 
FLibSYS::floatMergeWord::calc(TValFunc*)’:
sysfnc.h:1021: warning: dereferencing type-punned pointer will break 
strict-aliasing rules
>>> Нарушение strict aliasing может сломать некоторые оптимизации. Два выхода
>>> --
>>> или собрать с -fno-strict-aliasing или переписать код корректней.
>>>       
С -fno-strict-aliasing работает.
>> Я его записывал уже тремя различными способами с одинаковым результатом. :)
>>     
> И во всех трёх вариантах нарушили strict aliasing. Используйте union.
>   
С ним работает, но это не решение, поскольку приведенные мною обороты 
распространены и я не уверен что подобных проблем нет в других частях 
моей, в общем-то не маленькой, программы.

В любом случае спасибо за прояснение ситуации. И думаю багу повесить нужно.

С уважением, Роман
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : rom_as.vcf
Тип     : text/x-vcard
Размер  : 201 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20090807/6f73daf8/attachment.vcf>


Подробная информация о списке рассылки Sisyphus