| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > zlib trouble или очередной баг gcc. |
| Автор: Randajad 4.7.2012, 18:57 | ||||||||||
Интересные вещи происходят, господа!
Этот код вызывает краш. Если в main вызывать фу и не делать поток - все работает хорошо. Расследование показало: 1) Использование -msse дает этот баг. 2) Баг исходит из inflate.c, строка ~978.
3) Используется гцц от бусткодера. 4) Используется -O3. 5) Краш происходит в потоках. 6) Краш происходит вот здесь:
Я вставил два принтфа до и после цикла.
В дебуг версии злиба между принтфами примерно 10 инструкций. В релизе с -O3 & -msse инструкций оказывается овердофига.
Ваши предложения? Отказ от -O3 или -msse не предлагать. Нужно только решение проблемы! |
| Автор: Randajad 4.7.2012, 19:37 |
| Дела приобретают все более странное положение дел! Если создавать поток с помощью CreateThread от винапи - бага все-равно есть. Только вот теперь вопрос кого в баге винить. |
| Автор: boostcoder 4.7.2012, 19:52 |
не меня)) о таких тонкостях лучше спросить в списке рассылки: gcc-help@gcc.gnu.org и брось ссылку на тред ;) Добавлено через 2 минуты и 50 секунд есть две мысли: 1. попробуй с "-O2 & -msse" 2. похоже что код переупорядочен. у gcc, насколько я помню, есть ключик запрещающий компилятору переупорядочивать код. но я его не знаю :( |
| Автор: Randajad 4.7.2012, 19:58 |
| Похоже. Пробовал. Любое -O2 работает хорошо. |
| Автор: boostcoder 4.7.2012, 19:59 |
| но я все равно не понимаю, как переупорядочивание кода и треды создают подобную проблему |
| Автор: Randajad 4.7.2012, 20:15 | ||||
Похоже, цикл это вот это:
А все остальное я не знаю откуда берется. Сейчас дебажил в иде. Добавлено через 13 минут и 35 секунд При -O2 гцц разворачивает цикл немножко:
И сразу же делает printf("done\n"). Никакой ереси с xmm0 нет. |
| Автор: boostcoder 4.7.2012, 20:39 |
| так ты напишешь в список рассылки? |
| Автор: Randajad 4.7.2012, 20:41 |
| Гугление показало! Это из-за -ftree-vectorize, которое включается благодаря -O3. -O3 && -fno-tree-vectorize - полет нормальный. -mstackrealign избавляет от проблемы. Выравнивает по границе 16 байт, если есть SSE. Похоже, esp в главном потоке выровнено само, а в других всех - не выравнивается. Добавлено через 3 минуты и 11 секунд Или не похоже. Странная проблема. В теории, добавление этого ключа в код программы должно излечить. А злиб можно собирать как и собирался. Однако нет. Добавлено через 3 минуты и 49 секунд Не знаю. Может, пусть лучше это сделают более авторитетные люди? |
| Автор: boostcoder 4.7.2012, 20:51 |
| так и не понял %) проблема исправлена каким-то ключиком? или нет? и кто такие "более авторитетные люди" ? |
| Автор: Randajad 4.7.2012, 20:55 | ||
"Не похоже" - это я про свое ошибочное утверждение о выравнивании в потоках.
Так все работает. |
| Автор: boostcoder 4.7.2012, 21:07 |
| а '-ftree-vectorize' какой таки эффект дает? |
| Автор: Randajad 4.7.2012, 21:09 |
| -ftree-vectorize == crash. -ftree-vectorize & -mstackrealign == no crash. |
| Автор: boostcoder 4.7.2012, 21:27 |
| а с '-fno-tree-vectorize' ? |
| Автор: Randajad 4.7.2012, 21:35 |
| ??? && -fno-tree-vectorize == no crash. С -fno-tree-vectorize никогда не крашится, ибо не использует оно тогда SSE. Вообщем все работает хорошо с -fno-tree-vectorize || -mstackrealign, причем последний предпочтительней юзать, если, конечно, векторизация важна. Это, как я понял, старая бага GCC. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40838 Ключик -mstackrealign хотели запилить по-умолчанию, но до сих пор не сделали. |
| Автор: boostcoder 4.7.2012, 22:21 | ||
многа букаф |
| Автор: Randajad 5.7.2012, 11:17 |
| В кратце: GCC не всегда выравнивает стек по границе 16 байт, поэтому SSE команды, когда память не выровнена, вызывают сегфолт. |