![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Randajad |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Интересные вещи происходят, господа!
Этот код вызывает краш. Если в main вызывать фу и не делать поток - все работает хорошо. Расследование показало: 1) Использование -msse дает этот баг. 2) Баг исходит из inflate.c, строка ~978.
3) Используется гцц от бусткодера. 4) Используется -O3. 5) Краш происходит в потоках. 6) Краш происходит вот здесь:
Я вставил два принтфа до и после цикла.
В дебуг версии злиба между принтфами примерно 10 инструкций. В релизе с -O3 & -msse инструкций оказывается овердофига.
Ваши предложения? Отказ от -O3 или -msse не предлагать. Нужно только решение проблемы! Это сообщение отредактировал(а) Randajad - 4.7.2012, 19:57 |
||||||||||
|
|||||||||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Дела приобретают все более странное положение дел!
Если создавать поток с помощью CreateThread от винапи - бага все-равно есть. Только вот теперь вопрос кого в баге винить. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
не меня)) о таких тонкостях лучше спросить в списке рассылки: [email protected] и брось ссылку на тред ;) Добавлено через 2 минуты и 50 секунд есть две мысли: 1. попробуй с "-O2 & -msse" 2. похоже что код переупорядочен. у gcc, насколько я помню, есть ключик запрещающий компилятору переупорядочивать код. но я его не знаю :( |
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Похоже. Пробовал. Любое -O2 работает хорошо.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
но я все равно не понимаю, как переупорядочивание кода и треды создают подобную проблему
|
|||
|
||||
| Randajad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Похоже, цикл это вот это:
А все остальное я не знаю откуда берется. Сейчас дебажил в иде. Добавлено через 13 минут и 35 секунд При -O2 гцц разворачивает цикл немножко:
И сразу же делает printf("done\n"). Никакой ереси с xmm0 нет. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так ты напишешь в список рассылки?
|
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Гугление показало!
Это из-за -ftree-vectorize, которое включается благодаря -O3. -O3 && -fno-tree-vectorize - полет нормальный. -mstackrealign избавляет от проблемы. Выравнивает по границе 16 байт, если есть SSE. Похоже, esp в главном потоке выровнено само, а в других всех - не выравнивается. Добавлено через 3 минуты и 11 секунд Или не похоже. Странная проблема. В теории, добавление этого ключа в код программы должно излечить. А злиб можно собирать как и собирался. Однако нет. Добавлено через 3 минуты и 49 секунд Не знаю. Может, пусть лучше это сделают более авторитетные люди? Это сообщение отредактировал(а) Randajad - 4.7.2012, 20:41 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так и не понял %)
проблема исправлена каким-то ключиком? или нет? и кто такие "более авторитетные люди" ? |
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
"Не похоже" - это я про свое ошибочное утверждение о выравнивании в потоках.
Так все работает. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а '-ftree-vectorize' какой таки эффект дает?
|
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
-ftree-vectorize == crash.
-ftree-vectorize & -mstackrealign == no crash. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а с '-fno-tree-vectorize' ?
|
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
??? && -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 |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
многа букаф |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |