SSE+SSE3 в IDE работает вне IDE Вылет

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Maxizar » 15.05.2011 16:23:42

Всем привет. Почти закончил работу над БПФ, реализованном как на самом Free Pascal, так и на встроенном ассемблере. Реализовано на Free Pascal три подхода рекурсивный и два итеративных. На встроенном ассемблере было принято решение оптимизировать только рекурсивный и один из итеративных методов.

Но при оптимизации под SSE-SSE3. Получаю Магию…
Скажем в одной из тем я писал что не могу использовать команды MOVaPD, так как они требуют выравнивания на 16 байт.. оказалось, что если отключить дебагер или поставить оптимизацию выше О1 все работает.. для SSE2. для SSE и SSE3 все не так просто, если работать с командами не требующих выравнивания все пофиг все работает.. Но для команд с выравниванием Магия… Октлючаем дебагер.. в среде все работает, выкл среду, запускаем программу получаем вылет :(:


Запускаем среду компилим – работает, меняем оптимизацию О2, О3 в среде работает, а программа нет… Ставим галочку выносить отладочную инфу в отдельный файл – не помогло :(
Скажем для связки SSE2+SSE3 в среде все работает когда выставлено так:
Код: Выделить всё
Оптимизация О2
Дебагер Вкл
+ выносить отладочную инфу в отдельный файл

Но вне IDE программа валится :(

SSE+SSE3 – для команд требующих выравнивание работает в среде только так:
Код: Выделить всё
Оптимизация О2
Дебагер Октл
+ выносить отладочную инфу в отдельный файл

Но вне IDE программа валится :(

В среде конечно хорошо, но ведь программа должна работать сама по себе :(

lazarus-0.9.30-fpc-2.4.2-win32

Кто что скажет...
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Sergei I. Gorelkin » 15.05.2011 17:12:16

Пробовал запускать программу в gdb (без IDE) и после вылета смотреть, по каким адресам она пыталась обратиться?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Maxizar » 15.05.2011 17:35:24

Хм… вообще я ничего не понял.. если я правильно все запустил, а делал я это так:

Код: Выделить всё
C:\lazarus\mingw\bin>gdb.exe --exec=d:\Test_fft\2\FreePascal_ASM\O7(Only_SSE2+SS
E3_Align16)_NU\Recursive_fft_FP(ASM)\Test_fft.exe

GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb)
(gdb) run
Starting program: d:\Test_fft\2\FreePascal_ASM\O7(Only_SSE2+SSE3_Align16)_NU\Rec
ursive_fft_FP(ASM)\Test_fft.exe
[New Thread 2472.0xb98]
[New Thread 2472.0xf8]
[New Thread 2472.0x850]
[New Thread 2472.0x4c8]

Program exited normally.
(gdb)


Программа отработал как нужно спектр расчитали.., без отладчика я получаю Access violation. При расчете спектра. :(

Вот прикладываю исходники, две папки с выравниванием и без… и программа тестирования.. в программе нужно открыть файл Sampl.txt, это синусоида если быть честным сигнал wav файла 100000Гц. Амплитудой 32000.
При правильном расчете должны получить вот такой результат:

Изображение
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Sergei I. Gorelkin » 15.05.2011 19:12:37

Поведение воспроизводится, адреса тем не менее выровнены только по 8 байт (а не по 16). Почему оно при этом работает в отладчике - непонятно. Когда я экспериментировал с SSE, то при доступе к невыровненными данным прекрасно валилось и в отладчике, но это было в x86_64-linux.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Maxizar » 15.05.2011 21:43:22

:evil: хм... хорошо, нужно разобраться с выравниванием.... если что получится, отпишусь.
Наверное нужно еще FPC обновить до 2.5.1, может там уже починили, да и багтрекер завтра нужно почитать по этому поводу, я не думаю что я только встретил такое поведение :(....
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Sergei I. Gorelkin » 15.05.2011 22:11:45

Нет, не починили. Я проверял с 2.5.1. Но обновиться полезно почти всегда :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Ism » 15.05.2011 23:44:57

Access violation говорит сам за себя (обращение туда, куда нельзя обращаться), возможно дело в выделении памяти, отладчик выделяет память, а программа сама по себе нет.

Добавлено спустя 13 минут 38 секунд:
Кстати есть инструмент Вид -> Окна отладки -> Регистры ? Может сравнение данных до вылета на 207 строке чтото даст
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Sergei I. Gorelkin » 16.05.2011 01:33:47

Ism писал(а):Access violation говорит сам за себя (обращение туда, куда нельзя обращаться), возможно дело в выделении памяти, отладчик выделяет память, а программа сама по себе нет.

Если бы все было так просто... Особенности реализации FPC RTL таковы, что Access violation, он же SIGSEGV, он же Runtime error 216 является собирательным понятием и выдается во всех случаях, когда программе не удается определить ситуацию более точно. Например, в linux/x86_64 оно возникает даже при ошибках типа взятия квадратного корня от отрицательного числа...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Maxizar » 16.05.2011 18:07:14

Дело в выравнивании… если скажем остановится только на SSE командах… каким бы образом мы не компилировали (с вкл отладчиком, разными оптимизациями) exe файл сам по себе не работает, вылетает ошибка. Если же мы запустим эту программку под gdb вот так:
Изображение

Видно собственно виновника, первая команда требующая выравнивания… Оно вроде и понятно.

Но вот вам Магия:
Если поставить оптимизацию О1, Но выключить Дебаггер, и скомпилить и запустить программу в среде Lazarus, программа отрабатывает на ура…, если же запустить программу вне Ide ошибка.
Смешно конечно, но проблема в выравнивании, но как сказать FPC выравнивать на 16 байт я не знаю…
Если обратится к таким директивам как:
Код: Выделить всё
{$codealign VARMIN=16}
{$codealign VARMAX=16}
{$codealign LOCALMIN=16}
{$codealign LOCALMAX=16}
{$codealign PROC=16}
{$codealign JUMP=16}
{$codealign LOOP=16}
{$codealign CONSTMIN=16}
{$codealign CONSTMAX=16}
{$codealign RECORDMIN=16}
{$codealign RECORDMAX=16}
{$codealign 16}
{$align 16}   

Они ничего не исправили. Возможно некоторые статические константы или чень еще стали выровнены, а вот элементы динамического массива (комплексные числа) размером по 8 или 16 байт нет не стали. :( Вследствие чего мы видим ошибку.
Оно и понятно, по идее нам нужно
Код: Выделить всё
{$A16}

Ну это я так думаю… но есть только
Код: Выделить всё
{$A8}


Так что если Вы знаете как задать компилятору выравнивание не на 8 а на 16 байт будет очень кстати.

Вот наиболее близкие темы из БагТрекера:
http://bugs.freepascal.org/view.php?id=8986

написано мол если пересобрать FPC с параметром
Код: Выделить всё
make all FPC=ppcx64-2.1.5 OPT="-O-"

то мол все будет работать… но меня смущает 64.. и что это за –О- где про него написано…. Что он делает.
Ну у меня винда 32 битная и собирал я просто дав команду:
Код: Выделить всё
make all OPT="-O-"

Не знаю, но все собралось хорошо. После чего дал команду:
ZipInstall получил архив с FPC 2.5.1.
Сделал как написано тут: Как подключить к Lazarus новую версию компилятора FPC

После чего пересобрал Лазарус.. в About красуется надпись FPC 2.5.1 :)
Простая форма компилируется. и работает. Но у меня в коде есть такая вот процедура:
Код: Выделить всё
procedure _fft(var D:TCmxArray; StartIndex,ALen:Integer;
               const TableExp:TCmxArray); register; assembler;
{$ASMMODE intel}
  asm
// много кода

    //-------вызов функции FFT2(D,StartIndex,ALen,TableExp) ----- begin --------
    shr   ECX,1                 //ALen:=ALen shr 1;
    push  TableExp
    call  _fft                  //Вызываем _fft = Рекурсия БПФ,
                                //для первой половины данных
    //-------вызов функции FFT2(D,StartIndex,ALen,TableExp) ----- End ----------


Так вот на строчке:
Код: Выделить всё
    push  TableExp

Лазарус стал ругуаться так:
recursive_fft.pas(251,11) Error: Asm: 64 Bit operands not supported


вообще-то ошибка когда в функции\процедуре используется набор команд SSE когда все тоже самое, но команды заменены на SSE2, то все компилируется и ошибки нет.
в БагТрекере это похоже на вот эту ошибку:
Internal assembler doesn't support movd with xmm registers in 32-bit mode
может это таже самая ошибка? просто что-то сломали?

Так что вопросы такие:
Что это за мифический параметр OPT="-O-" и работает ли он для 32 бит. ?
Если работает и именно он включает возможность выравнивания на 16 байт, то что за ошибка? если зайти в IDE FPC то в About написано что i386... а тут он расценил как 64 битную операцию :(
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Sergei I. Gorelkin » 16.05.2011 23:07:55

Параметр -О- просто отключает оптимизацию, в нем нет ничего мифического. В 32-бит работает. На выравнивание он не влияет.

Как я уже писал в соседней ветке, динамические массивы на 32-битных платформах по определению не выровнены, и добиться их выравнивания невозможно никакими настройками. Выровнены результаты GetMem, а динамический массив добавляет свои 8 байт для хранения длины и счетчика ссылок, поэтому первый элемент всегда не там где надо. На 64-битных платформах 8 байт превращаются в 16 и таким образом получается то, что нужно. Но это, как говорится, не ваша заслуга, а наша недоработка.

Что там творится с push, пока не совсем понятно (и еще более непонятно, почему оно проявляется при смене sse2 и sse) но его все равно нужно патчить для 64-бит.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Maxizar » 17.05.2011 11:00:24

Sergei I. Gorelkin писал(а):Параметр -О- просто отключает оптимизацию, в нем нет ничего мифического. В 32-бит работает. На выравнивание он не влияет.


Понятно… просто в багТрекере, написали мол собери и будет тебе счастье.. и вообще иногда такие фишки, не понятно где описаны… вот где я вообще должен был прочитать про -О-?.. Хотя сейчас это и не так важно…
Но как я и писал выше, там что то было про 64 бит, возможно по этому у них все и работало :(.

Вот, что только говорить про то, что в динамическом массиве по смещению -4 лежит не Length а High, вот где это официально документировано не понятно. Вот вроде мелочь, но еслиб не Вы, где бы я это нашел тоже не понятно.. ну да ладно…

Sergei I. Gorelkin писал(а):Как я уже писал в соседней ветке, динамические массивы на 32-битных платформах по определению не выровнены, и добиться их выравнивания невозможно никакими настройками. Выровнены результаты GetMem, а динамический массив добавляет свои 8 байт для хранения длины и счетчика ссылок, поэтому первый элемент всегда не там где надо.


Да теперь вроде я понял.. но а почему нельзя добавить еще 8 байт ну не знаю просто хотя бы одних нулей и дело в шляпе… Если считать что выравнивание по умолчанию на 16 байт (если я опять ничего не напутал). А при задании {$Align 8} эти лишние 8 байт нулей уже не использовать. Но это ИМХО конечно… я не очень еще в таких тонкостях :(

Sergei I. Gorelkin писал(а):Что там творится с push, пока не совсем понятно (и еще более непонятно, почему оно проявляется при смене sse2 и sse) но его все равно нужно патчить для 64-бит.


То что патчить для 64 бит оно вроде и понятно, но тут именно дело с SSE+ Push на 32 битной системе с 32 битным FPC, ведь если скажем просто закоментить все Push то все собирается и компилится… (программа получается не рабочая) но компилятор все съел.. или скажем наоборот если закомментировать все операции и команды SSE в модуле, а Push оставить, то тоже все собирается и компилится.
При этом Команды именно SSE, если в этом же модуле заменить их на SSE2 а Push оставить, то все опять хорошо…. Магия одним словом..
Получается что именно SSE + Push на 32 битном FPC не могут подружится :(

PS. Наверное хоть и команды (SSE - SSE3)требующие 16 байт выравнивания и не работают с динамическими массивами, все же я наверное постараюсь написать что-то вроде маленькой шпаргалки по БПФ, по шагам, как делал я… там ничего особенного нету, но скажем я смог добиться результатов на ровне с FFTW и превзошел результаты ALGLIB_FFT (по скорости выполнения) даже на чистом Free Pascal, без асма. Что же касается FFTW, то там без асма тягаться было сложно..
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Sergei I. Gorelkin » 17.05.2011 11:26:20

Выложи, пожалуйста, проект, в котором push не дружит с SSE.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Maxizar » 17.05.2011 12:19:32

Выложи, пожалуйста, проект, в котором push не дружит с SSE.


Причем не дружит именно FPC 2.5.1 + Lazarus 0.9.31. У Lazarus 0.9.30 в котором fpc 2.4.2 все ок.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Sergei I. Gorelkin » 17.05.2011 13:25:51

Что-то "как есть" не воспроизводится ни разу :( Возможен вариант, что оно "случайно" исправилось моим вчерашним коммитом...

Зато при компиляции с внешним ассемблером (-Aas) воспроизводится на всех трех проектах, независимо от SSE/SSE2. Оно пытается запихнуть в стек, если я не ошибаюсь, аж тип extended (10 байт). Что ж, будем лечить...

Update: внушить правильное поведение можно, написав "push dword ptr TableExp"
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SSE+SSE3 в IDE работает вне IDE Вылет

Сообщение Maxizar » 17.05.2011 18:31:53

Что-то "как есть" не воспроизводится ни разу Возможен вариант, что оно "случайно" исправилось моим вчерашним коммитом...


до этого был FPC 2.5.1 svn: 17379
решил обновить, в папку с FPC при помощи TortoiseSVN говорю обновить, (http://svn.freepascal.org/svn/fpc/trunk) обновлял целых 2.5 часов (ну не знаю серверу наверное труба) обновился и TortoiseSVN говорит обновили до ревизии 17482.
Даю команду:
Код: Выделить всё
Make all

доходит до определенного момента и говорит ошибка даже 2.
Изображение

я что то сделал не так?
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru