Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> zlib trouble или очередной баг gcc. 
:(
    Опции темы
Randajad
Дата 4.7.2012, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Интересные вещи происходят, господа!

Код

#include <thread>
#include <zlib.h>
#include <stdio.h>

void foo() {
    uint8_t buf[10 * 1024];
    uint8_t data[5 * 1024];

    uLong pack_len = sizeof(buf);
    if(compress2(buf, &pack_len, data, sizeof(data), 9) != Z_OK)
        return;

    printf("compressed\n");

    uLong len = sizeof(data);
    uncompress(data, &len, buf, pack_len);
}

int main() {
    std::thread(&foo).join();
    return 0;
}


Этот код вызывает краш. Если в main вызывать фу и не делать поток - все работает хорошо.

Расследование показало:
1) Использование -msse дает этот баг.
2) Баг исходит из inflate.c, строка ~978.
Код

                    while (copy--)
                        state->lens[state->have++] = (unsigned short)len;

3) Используется гцц от бусткодера.
4) Используется -O3.
5) Краш происходит в потоках.
6) Краш происходит вот здесь:
Код

.text:004068DB                 movaps  [esp+0BCh+var_8C], xmm0


Я вставил два принтфа до и после цикла.
Код

                printf("%p %d %d\n", state->lens, state->have, copy);
                    while (copy--)
                        state->lens[state->have++] = (unsigned short)len;
        printf("done\n");


В дебуг версии злиба между принтфами примерно 10 инструкций.
В релизе с -O3 & -msse инструкций оказывается овердофига.

Код

.text:004067E1                 mov     [esp+0BCh+var_BC], offset aPDD ; "%p %d %d\n"
.text:004067E8                 mov     [esp+0BCh+var_B0], edx
.text:004067EC                 mov     edx, [esp+0BCh+var_48]
.text:004067F0                 mov     [esp+0BCh+var_B4], eax
.text:004067F4                 mov     [esp+0BCh+var_B8], edx
.text:004067F8                 call    printf
.text:004067FD                 mov     eax, [esp+0BCh+var_90]
.text:00406801                 mov     word ptr [esp+0BCh+var_54], bx
.text:00406806                 mov     ebx, [esp+0BCh+var_90]
.text:0040680A                 mov     ecx, [esp+0BCh+var_6C]
.text:0040680E                 mov     eax, [eax+68h]
.text:00406811                 sub     ecx, 1
.text:00406814                 mov     [esp+0BCh+var_7C], ecx
.text:00406818                 mov     ecx, [esp+0BCh+var_6C]
.text:0040681C                 mov     [esp+0BCh+var_3C], eax
.text:00406823                 add     eax, 38h
.text:00406826                 mov     [esp+0BCh+var_38], eax
.text:0040682D                 lea     eax, [ebx+eax*2]
.text:00406830                 and     eax, 0Fh
.text:00406833                 shr     eax, 1
.text:00406835                 neg     eax
.text:00406837                 and     eax, 7
.text:0040683A                 cmp     [esp+0BCh+var_6C], eax
.text:0040683E                 cmova   ecx, eax
.text:00406841                 cmp     [esp+0BCh+var_6C], 0Ah
.text:00406846                 ja      loc_407B7C
.text:0040684C                 mov     ecx, [esp+0BCh+var_6C]
.text:00406850
.text:00406850 loc_406850:                             ; CODE XREF: sub_4058B0+22CEj
.text:00406850                 mov     edx, [esp+0BCh+var_7C]
.text:00406854                 mov     dword ptr [esp+0BCh+var_8C], ebp
.text:00406858                 mov     eax, [esp+0BCh+var_3C]
.text:0040685F                 mov     [esp+0BCh+var_60], edi
.text:00406863                 mov     ebx, [esp+0BCh+var_94]
.text:00406867                 mov     [esp+0BCh+var_40], esi
.text:0040686B                 mov     edi, [esp+0BCh+var_90]
.text:0040686F                 mov     esi, [esp+0BCh+var_7C]
.text:00406873                 sub     edx, ecx
.text:00406875                 movzx   ebp, word ptr [esp+0BCh+var_54]
.text:0040687A                 lea     esi, [esi+0]
.text:00406880
.text:00406880 loc_406880:                             ; CODE XREF: sub_4058B0+FDDj
.text:00406880                 sub     esi, 1
.text:00406883                 add     eax, 1
.text:00406886                 cmp     esi, edx
.text:00406888                 mov     [edi+eax*2+6Eh], bp
.text:0040688D                 jnz     short loc_406880
.text:0040688F                 cmp     [esp+0BCh+var_6C], ecx
.text:00406893                 mov     [esp+0BCh+var_7C], esi
.text:00406897                 mov     ebp, dword ptr [esp+0BCh+var_8C]
.text:0040689B                 mov     edi, [esp+0BCh+var_60]
.text:0040689F                 mov     [esp+0BCh+var_94], ebx
.text:004068A3                 mov     esi, [esp+0BCh+var_40]
.text:004068A7                 jz      loc_4069C4
.text:004068AD
.text:004068AD loc_4068AD:                             ; CODE XREF: sub_4058B0+22DBj
.text:004068AD                 mov     edx, [esp+0BCh+var_6C]
.text:004068B1                 sub     edx, ecx
.text:004068B3                 mov     [esp+0BCh+var_34], edx
.text:004068BA                 shr     edx, 3
.text:004068BD                 mov     [esp+0BCh+var_30], edx
.text:004068C4                 shl     edx, 3
.text:004068C7                 test    edx, edx
.text:004068C9                 mov     [esp+0BCh+var_60], edx
.text:004068CD                 jz      loc_40699A
.text:004068D3                 xorps   xmm0, xmm0
.text:004068D6                 movzx   edx, word ptr [esp+0BCh+var_54]
.text:004068DB                 movaps  [esp+0BCh+var_8C], xmm0 /// ВОТ ЗДЕСЬ!
.text:004068E0                 mov     ebx, edx
.text:004068E2                 mov     word ptr [esp+0BCh+var_8C], dx
.text:004068E7                 mov     edx, dword ptr [esp+0BCh+var_8C]
.text:004068EB                 shl     ebx, 10h
.text:004068EE                 mov     [esp+0BCh+var_40], ebx
.text:004068F2                 movzx   edx, dx
.text:004068F5                 or      ebx, edx
.text:004068F7                 movzx   edx, word ptr [esp+0BCh+var_54]
.text:004068FC                 mov     dword ptr [esp+0BCh+var_8C], ebx
.text:00406900                 mov     ebx, [esp+0BCh+var_40]
.text:00406904                 mov     word ptr [esp+0BCh+var_8C+4], dx
.text:00406909                 mov     edx, dword ptr [esp+0BCh+var_8C+4]
.text:0040690D                 movzx   edx, dx
.text:00406910                 or      ebx, edx
.text:00406912                 movzx   edx, word ptr [esp+0BCh+var_54]
.text:00406917                 mov     dword ptr [esp+0BCh+var_8C+4], ebx
.text:0040691B                 mov     ebx, [esp+0BCh+var_40]
.text:0040691F                 mov     word ptr [esp+0BCh+var_8C+8], dx
.text:00406924                 mov     edx, dword ptr [esp+0BCh+var_8C+8]
.text:00406928                 movzx   edx, dx
.text:0040692B                 or      ebx, edx
.text:0040692D                 movzx   edx, word ptr [esp+0BCh+var_54]
.text:00406932                 mov     dword ptr [esp+0BCh+var_8C+8], ebx
.text:00406936                 mov     ebx, [esp+0BCh+var_40]
.text:0040693A                 mov     [esp+0BCh+var_40], ebp
.text:0040693E                 mov     ebp, [esp+0BCh+var_30]
.text:00406945                 mov     word ptr [esp+0BCh+var_8C+0Ch], dx
.text:0040694A                 mov     edx, dword ptr [esp+0BCh+var_8C+0Ch]
.text:0040694E                 movzx   edx, dx
.text:00406951                 or      ebx, edx
.text:00406953                 mov     edx, [esp+0BCh+var_38]
.text:0040695A                 mov     dword ptr [esp+0BCh+var_8C+0Ch], ebx
.text:0040695E                 mov     ebx, [esp+0BCh+var_90]
.text:00406962                 movaps  xmm0, [esp+0BCh+var_8C]
.text:00406967                 add     edx, ecx
.text:00406969                 lea     ecx, [ebx+edx*2]
.text:0040696C                 mov     ebx, [esp+0BCh+var_94]
.text:00406970                 xor     edx, edx
.text:00406972
.text:00406972 loc_406972:                             ; CODE XREF: sub_4058B0+10CDj
.text:00406972                 add     edx, 1
.text:00406975                 movaps  xmmword ptr [ecx], xmm0
.text:00406978                 add     ecx, 10h
.text:0040697B                 cmp     edx, ebp
.text:0040697D                 jb      short loc_406972
.text:0040697F                 mov     edx, [esp+0BCh+var_60]
.text:00406983                 sub     [esp+0BCh+var_7C], edx
.text:00406987                 mov     ebp, [esp+0BCh+var_40]
.text:0040698B                 mov     [esp+0BCh+var_94], ebx
.text:0040698F                 add     eax, edx
.text:00406991                 cmp     [esp+0BCh+var_34], edx
.text:00406998                 jz      short loc_4069C4
.text:0040699A
.text:0040699A loc_40699A:                             ; CODE XREF: sub_4058B0+101Dj
.text:0040699A                 mov     ebx, [esp+0BCh+var_90]
.text:0040699E                 movzx   ecx, word ptr [esp+0BCh+var_54]
.text:004069A3                 lea     edx, [ebx+eax*2+70h]
.text:004069A7                 mov     ebx, [esp+0BCh+var_44]
.text:004069AB                 add     eax, [esp+0BCh+var_7C]
.text:004069AF                 lea     eax, [ebx+eax*2]
.text:004069B2                 mov     ebx, [esp+0BCh+var_94]
.text:004069B6
.text:004069B6 loc_4069B6:                             ; CODE XREF: sub_4058B0+110Ej
.text:004069B6                 mov     [edx], cx
.text:004069B9                 add     edx, 2
.text:004069BC                 cmp     edx, eax
.text:004069BE                 jnz     short loc_4069B6
.text:004069C0                 mov     [esp+0BCh+var_94], ebx
.text:004069C4
.text:004069C4 loc_4069C4:                             ; CODE XREF: sub_4058B0+FF7j
.text:004069C4                                         ; sub_4058B0+10E8j
.text:004069C4                 mov     ebx, [esp+0BCh+var_90]
.text:004069C8                 mov     eax, [esp+0BCh+var_6C]
.text:004069CC                 add     eax, [esp+0BCh+var_3C]
.text:004069D3                 mov     [ebx+68h], eax
.text:004069D6                 mov     [esp+0BCh+var_BC], offset aDone ; "done"
.text:004069DD                 call    puts


Ваши предложения?
Отказ от -O3 или -msse не предлагать. Нужно только решение проблемы!

Это сообщение отредактировал(а) Randajad - 4.7.2012, 19:57
PM MAIL   Вверх
Randajad
Дата 4.7.2012, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Дела приобретают все более странное положение дел!
Если создавать поток с помощью CreateThread от винапи - бага все-равно есть. Только вот теперь вопрос кого в баге винить.
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Randajad @  4.7.2012,  19:37 Найти цитируемый пост)
 кого в баге винить. 

не меня))

о таких тонкостях лучше спросить в списке рассылки: [email protected]
и брось ссылку на тред ;)

Добавлено через 2 минуты и 50 секунд
Цитата(Randajad @  4.7.2012,  18:57 Найти цитируемый пост)
В релизе с -O3 & -msse инструкций оказывается овердофига.

есть две мысли:
1. попробуй с "-O2 & -msse"
2. похоже что код переупорядочен. у gcc, насколько я помню, есть ключик запрещающий компилятору переупорядочивать код. но я его не знаю :(

PM WWW   Вверх
Randajad
Дата 4.7.2012, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Похоже. Пробовал. Любое -O2 работает хорошо.
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



но я все равно не понимаю, как переупорядочивание кода и треды создают подобную проблему smile 
PM WWW   Вверх
Randajad
Дата 4.7.2012, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Похоже, цикл это вот это:

Код

.text:0040B474 loc_40B474:                             ; CODE XREF: sub_4079A0+3AE1j
.text:0040B474 sub     ecx, 1
.text:0040B477 add     edx, 1
.text:0040B47A cmp     ecx, eax
.text:0040B47C mov     [edi+edx*2+6Eh], bp
.text:0040B481 jnz     short loc_40B474


А все остальное я не знаю откуда берется. Сейчас дебажил в иде.

Добавлено через 13 минут и 35 секунд
При -O2 гцц разворачивает цикл немножко:

Код

.text:00409FC1 loc_409FC1:                             ; CODE XREF: sub_4065F0+39F7j
.text:00409FC1 mov     [eax], dx
.text:00409FC4 mov     [eax+2], dx
.text:00409FC8 mov     [eax+4], dx
.text:00409FCC mov     [eax+6], dx
.text:00409FD0 mov     [eax+8], dx
.text:00409FD4 mov     [eax+0Ah], dx
.text:00409FD8 mov     [eax+0Ch], dx
.text:00409FDC mov     [eax+0Eh], dx
.text:00409FE0 add     eax, 10h
.text:00409FE3 cmp     eax, [esp+9Ch+var_6C]
.text:00409FE7 jnz     short loc_409FC1
.text:00409FE9


И сразу же делает printf("done\n"). Никакой ереси с xmm0 нет.
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



так ты напишешь в список рассылки?
PM WWW   Вверх
Randajad
Дата 4.7.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Гугление показало!
Это из-за -ftree-vectorize, которое включается благодаря -O3. -O3 && -fno-tree-vectorize - полет нормальный.

-mstackrealign избавляет от проблемы. Выравнивает по границе 16 байт, если есть SSE.
Похоже, esp в главном потоке выровнено само, а в других всех - не выравнивается.

Добавлено через 3 минуты и 11 секунд
Или не похоже. Странная проблема. В теории, добавление этого ключа в код программы должно излечить. А злиб можно собирать как и собирался. Однако нет.

Добавлено через 3 минуты и 49 секунд
Не знаю. Может, пусть лучше это сделают более авторитетные люди?  smile 

Это сообщение отредактировал(а) Randajad - 4.7.2012, 20:41
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



так и не понял %)
проблема исправлена каким-то ключиком? или нет?
и кто такие "более авторитетные люди" ?

PM WWW   Вверх
Randajad
Дата 4.7.2012, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



"Не похоже" - это я про свое ошибочное утверждение о выравнивании в потоках.

Цитата

-mstackrealign избавляет от проблемы. 


Так все работает.
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



а '-ftree-vectorize' какой таки эффект дает?
PM WWW   Вверх
Randajad
Дата 4.7.2012, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



-ftree-vectorize == crash.
-ftree-vectorize & -mstackrealign == no crash.
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



а с '-fno-tree-vectorize' ?

PM WWW   Вверх
Randajad
Дата 4.7.2012, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 хотели запилить по-умолчанию, но до сих пор не сделали.
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Randajad @  4.7.2012,  21:35 Найти цитируемый пост)
Это, как я понял, старая бага GCC.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40838

многа букаф smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.