Re[20]: Бойтесь alloca
От: ДимДимыч Украина http://klug.org.ua
Дата: 28.03.07 11:15
Оценка:
Здравствуйте, Erop, Вы писали:

R>>>В windows из-за хорошо подобранного названия всё получается просто: ACCESS_VIOLATION — ошибка зашиты памяти.

ДД>>Если быть точным, то "нарушение доступа". Хорошо, что PERMISSION_DENIED не назвали
E>Это ты про UNIX-like?

Да про все понемножку
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: Бойтесь alloca
От: rm822 Россия  
Дата: 28.03.07 11:34
Оценка:
R>А вот здесь
Автор: Programador
Дата: 27.03.07
говорят, что ничего не падает... очная ставка!

Там говорят отчасти правду, позор на мои седины.
На 2005.sp1 оно работает правильно, это у меня ошибка в коде
Там компилер присутствие alloca воспринимает весьма однозначно.
1. функция не будет заинлайнена
2. функция не будет заинлайнена даже если вызов alloca будет выброшен в процессе оптимизации
3. в функции будет сгенерирован пролог и эпилог проверяющий состояние стека.

про VC6 правду написал — инлайнит и падает.
VC7 под рукой нету
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Бойтесь alloca
От: Andrew S Россия http://alchemy-lab.com
Дата: 28.03.07 12:19
Оценка:
R>Наконец понял
R>Правда без собственных тестов не обошлось. Пришлось заменить __inline на __forceinline, т.к. иначе всё работало и под релизом...
R>Мой вывод такой:

R>Вот описание функции из MSDN:

R>

R>_alloca allocates size bytes from the program stack. The allocated space is automatically freed when the calling function exits (not when the allocation merely passes out of scope)


R>А фактически получается, что работает так:

R>

R>_alloca allocates size bytes from the program stack. The allocated space is automatically freed when the first non-inlined calling function exits (not when the calling function exits and not when the allocation merely passes out of scope)


R>Основная проблема в том, что нельзя угадать как компилятор заинлайнит функции.


Имхо, это просто тупая бага компилятора, за которую нужно отрывать руки. Мне лично плевать, что там делает оптимизатор\линкер — инлайнит или нет. Я описал валидную языковую конструкцию, значит, она должна при любой агрессивной оптимизации работать — иначе это уже не оптимизация. Вариантов у компилятора как минимум 2 — либо правильно инлайнить (как делает, по моим воспоминаям, ватком — там это был обычный прием оптимизации — вынести alloca в отдельную функцию), при этом восстанавливая стек фрейм (больших проблем в кодогенерации я тут не вижу — да вообще никаких проблем не вижу, тем более сейчас компилятор пытается это делать, используя для адресации локальных переменных ebp (именно и только в такой функции) и сохраняя и восстанавливая значение esp (правда, немного не в том месте). Либо не инлайнить вообще, как поступает gcс (что чревато, поскольку это один из приемов оптимизации).
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[7]: И на старуху...
От: remark Россия http://www.1024cores.net/
Дата: 28.03.07 14:10
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Имхо, это просто тупая бага компилятора, за которую нужно отрывать руки. Мне лично плевать, что там делает оптимизатор\линкер — инлайнит или нет. Я описал валидную языковую конструкцию, значит, она должна при любой агрессивной оптимизации работать — иначе это уже не оптимизация. Вариантов у компилятора как минимум 2 — либо правильно инлайнить (как делает, по моим воспоминаям, ватком — там это был обычный прием оптимизации — вынести alloca в отдельную функцию), при этом восстанавливая стек фрейм (больших проблем в кодогенерации я тут не вижу — да вообще никаких проблем не вижу, тем более сейчас компилятор пытается это делать, используя для адресации локальных переменных ebp (именно и только в такой функции) и сохраняя и восстанавливая значение esp (правда, немного не в том месте). Либо не инлайнить вообще, как поступает gcс (что чревато, поскольку это один из приемов оптимизации).



void allo() __attribute__((always_inline));

void allo()
{
    alloca(1024 * 500); // 500k
}

int main()
{
        for (int x = 0; x < 8; ++x)
            allo();
}



gcc4.1.1 — stack overflow

компилирую с -O3 больше никаких опций нет
причём если сделать цикл до 4, то не падает
если он складывает все стеки, то 500k * 4 = 2М
а если не складывает, то почему при 8 падает


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: И на старуху...
От: Andrew S Россия http://alchemy-lab.com
Дата: 28.03.07 14:27
Оценка:
R>
R>void allo() __attribute__((always_inline));

R>void allo()
R>{
R>    alloca(1024 * 500); // 500k
R>}

R>int main()
R>{
R>        for (int x = 0; x < 8; ++x)
R>            allo();
R>}
R>



R>gcc4.1.1 — stack overflow


R>компилирую с -O3 больше никаких опций нет

R>причём если сделать цикл до 4, то не падает
R>если он складывает все стеки, то 500k * 4 = 2М
R>а если не складывает, то почему при 8 падает

Может, в данном случае он просто разворачивает цикл? Конечно, это не оправдывает некорректной работы результата.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Бойтесь alloca
От: remark Россия http://www.1024cores.net/
Дата: 28.03.07 14:28
Оценка:
Здравствуйте, rm822, Вы писали:

R>>А вот здесь
Автор: Programador
Дата: 27.03.07
говорят, что ничего не падает... очная ставка!

R>Там говорят отчасти правду, позор на мои седины.
R>На 2005.sp1 оно работает правильно, это у меня ошибка в коде
R>Там компилер присутствие alloca воспринимает весьма однозначно.
R>1. функция не будет заинлайнена
R>2. функция не будет заинлайнена даже если вызов alloca будет выброшен в процессе оптимизации
R>3. в функции будет сгенерирован пролог и эпилог проверяющий состояние стека.

R>про VC6 правду написал — инлайнит и падает.

R>VC7 под рукой нету

под vc71 всё плохо

а ты попробуй на 2005.sp1 включить максимальные оптимизации, у меня тоже не сразу получилось под vc71
В частности:
Optimization — O2
Inline Function Expansion — Any Suitable

Так же попробуй __forceinline


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: адрес потрассируй!
От: Erop Россия  
Дата: 28.03.07 14:33
Оценка:
Здравствуйте, remark, Вы писали:

R>
void traceIt( void* a )
{
    std::cout << "Trace address:" << (int)a << std::endl; 
}

void allo() __attribute__((always_inline));

void allo()
{
    void * p = alloca(1024 * 500); // 500k
        traceIt( p );

}

int main()
{
        for (int x = 0; x < 8; ++x)
            allo();
}


Чито так пишет?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: И на старуху...
От: remark Россия http://www.1024cores.net/
Дата: 28.03.07 14:42
Оценка:
Здравствуйте, Andrew S, Вы писали:

R>>gcc4.1.1 — stack overflow


R>>компилирую с -O3 больше никаких опций нет

R>>причём если сделать цикл до 4, то не падает
R>>если он складывает все стеки, то 500k * 4 = 2М
R>>а если не складывает, то почему при 8 падает

AS>Может, в данном случае он просто разворачивает цикл? Конечно, это не оправдывает некорректной работы результата.


Я чо-то не понимаю по асму — там белибирда какая-то...
Но видимо что-то типа того. Тем не менее суть остаётся прежней — у gcc тоже с этим плохо


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: адрес потрассируй!
От: remark Россия http://www.1024cores.net/
Дата: 28.03.07 14:44
Оценка: 8 (1)
Здравствуйте, Erop, Вы писали:

E>Чито так пишет?


До смерти выдал:

Trace address:1781552
Trace address:1269536
Trace address:757520
Trace address:245504





1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: адрес потрассируй!
От: Erop Россия  
Дата: 28.03.07 15:51
Оценка:
Здравствуйте, remark, Вы писали:

R>До смерти выдал:


R>

R>Trace address:1781552
R>Trace address:1269536
R>Trace address:757520
R>Trace address:245504


Ну вот его и заловили с поличным

R>

Взаимно: , хоть мне и нельзя
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: адрес потрассируй!
От: Erop Россия  
Дата: 28.03.07 15:55
Оценка:
Здравствуйте, remark, Вы писали:

R>До смерти выдал:


R>

R>Trace address:245504



А если цикл до 4 крутить, то типа пролащит ещё?
Типа повезло с константами?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Бойтесь alloca
От: rm822 Россия  
Дата: 28.03.07 16:03
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, rm822, Вы писали:


R>>>А вот здесь
Автор: Programador
Дата: 27.03.07
говорят, что ничего не падает... очная ставка!

R>>Там говорят отчасти правду, позор на мои седины.
R>>На 2005.sp1 оно работает правильно, это у меня ошибка в коде
R>>Там компилер присутствие alloca воспринимает весьма однозначно.
R>>1. функция не будет заинлайнена
R>>2. функция не будет заинлайнена даже если вызов alloca будет выброшен в процессе оптимизации
R>>3. в функции будет сгенерирован пролог и эпилог проверяющий состояние стека.

R>>про VC6 правду написал — инлайнит и падает.

R>>VC7 под рукой нету

R>под vc71 всё плохо


R>а ты попробуй на 2005.sp1 включить максимальные оптимизации, у меня тоже не сразу получилось под vc71

R>В частности:
R>Optimization — O2
R>Inline Function Expansion — Any Suitable
Пробовал, не надает.

R>Так же попробуй __forceinline

пробовал -не падает
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: адрес потрассируй!
От: remark Россия http://www.1024cores.net/
Дата: 28.03.07 16:09
Оценка:
Здравствуйте, Erop, Вы писали:

E>А если цикл до 4 крутить, то типа пролащит ещё?


Да, если 4, то отрабатывает нормально...

E>Типа повезло с константами?


Я так и не понял с чем повезло


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.