LINUX.ORG.RU

Бред компилятора


0

0

Есть код:
double d1 = 0;
double d2 = 1;
double d3 = 1.01;
__m128d pd, pd2;
pd = _mm_loadh_pd(pd, &d1);
pd = _mm_loadl_pd(pd, &d2);
pd2 = _mm_loadh_pd(pd2, &d3);
pd2 = _mm_loadl_pd(pd2, &d3);

for(long i=0; i<10000000000; i++){
pd = _mm_mul_pd(pd, pd2);
};

_mm_storeh_pd(&d1, pd);
_mm_storel_pd(&d2, pd);

так вот на месте цикла компилятор делает вот такую галиматью:
.L13:
movapd -320(%rbp), %xmm0
movapd %xmm0, -128(%rbp) ??
movapd -304(%rbp), %xmm0
movapd %xmm0, -144(%rbp) ??
movapd -144(%rbp), %xmm1 Бугага
movapd -128(%rbp), %xmm0 Бугага в квадрате
mulpd %xmm1, %xmm0
movapd %xmm0, -320(%rbp)
addq $1, -272(%rbp)
.L12:
movabsq $9999999999, %rax
cmpq %rax, -272(%rbp)

что оно не может вместо такого убожества выдать такое
.L13:
movapd -320(%rbp), %xmm0
movapd -304(%rbp), %xmm1
mulpd %xmm1, %xmm0
movapd %xmm0, -320(%rbp)
addq $1, -272(%rbp)
.L12:
movabsq $9999999999, %rax
cmpq %rax, -272(%rbp)

anonymous
Ответ на: комментарий от true_admin

Не тут и -O1 помогает все в регистры запихать, но сам факт того что при использовании встроенных операций компилятор может пораждать такую ахинею вызывает внутренний переворот в сознании! ну банальное сложение _mm_add_pd и 7!!! операций с памятью когда даже по виду функции больше 3 без поллитры непридумаешь. И это называется генерацией качественного кода :(

anonymous
()
Ответ на: комментарий от anonymous

>Не тут и -O1 помогает все в регистры запихать, но сам факт того что при использовании встроенных операций компилятор может пораждать такую ахинею вызывает внутренний переворот в сознании! ну банальное сложение _mm_add_pd и 7!!! операций с памятью когда даже по виду функции больше 3 без поллитры непридумаешь. И это называется генерацией качественного кода :(

Напиши багрепорт, фиг ли на ЛОРе возмущаться?

JackYF ★★★★
()
Ответ на: комментарий от JackYF

Уже написал, а тут я не возмущаюсь как ты подумал а доношу полезную инфу до людей.

Скоко ты в реальной проге будешь искать ответ на вопрос типа: я тут ввел обработку двух потоков данных а не одного а прога стала дико тормозить?

Скоко времени удет на то чтобы родилась мысль глянуть в ассемблер и включить оптимизацию? У некоторых сразу а некоторым придется дооолго подумать. Себя ч думаю ты конечно к первой категории людей отнесешь...

anonymous
()

> for(long i=0; i<10000000000; i++){

> pd = _mm_mul_pd(pd, pd2);

> };

Исходя из из точки с запятой после закрывающей фигурной скобки могу сделать вывод, что человек только недавно пришёл в Си из Паскаля или Делфи.

anonymous
()
Ответ на: комментарий от anonymous

> А что такое Делфи?

Делфи - это среда разработки на Паскале, в котором исторически принято считать точку с запятой за оператор и как раз не ставить её при возможности. Так что анонимус подоблажался малёх.

anonymous
()

Мне кажется компилятор всегда пытается разместить данные по выровненным адресам при работе с sse даже если это не требуется. Это всего лишь универсальный алгоритм. Эксклюзивные вещи всегда на асме пишутся :)

koTuk
()
Ответ на: комментарий от anonymous

>Скоко времени удет на то чтобы родилась мысль глянуть в ассемблер и включить оптимизацию?

Ты знаешь, я включаю как минимум -O2. Оптимизация не помешает.

JackYF ★★★★
()
Ответ на: комментарий от JackYF

Ага особенно при отладке сложных математических алгоритмов... сидишь и думаешь где там что наоптимизировано чтот программа рушится (ошибка в доступе к памяти может проскочить в неоптимизированном коде и его можно более менее отладить а в оптимизированном такая фича не покатит)

Вообщето работа с запакованными данными вещь не эксклюзивная чтобы её на асме писать, а потом что-то типа- запихнул в память, высунул из памяти, опять запихнул|, опять высунул, обработал - это не выравнивание и не эксклюзивный алгоритм - это идиотизм

anonymous
()
Ответ на: комментарий от anonymous

отладка и оптимизация это разные вещи. Сначала отлаживаешь, потом оптимизируешь или наоборот.

Ну а то что gcc странные вещи делает так у них вечно куча багов в багзилле. Многие ругаются на gcc, но альтернативы ему нет и не предвидится.

true_admin ★★★★★
()
Ответ на: комментарий от anonymous

Эксклюзивное - имеется ввиду без лишнего г-на которое компилятор ВСЕГДА дописывает даже если оно там никогда не понадобится - достаточно взглянуть на ЛЮБУЮ ф-ию С (впрочем как и любой другой язык высокого уровня), которой например стек вообще не требуется при исполнении но тот же gcc ВСЕГДА с любыми флагами оптимизации будет использовать enter и leave.

koTuk
()
Ответ на: комментарий от koTuk

Че то я не замечал чтобы привызове extern "C" функций gcc всегда использовал enter... Хотя такая хня может тоже есть.

anonymous
()
Ответ на: комментарий от anonymous

И вообще - при чем тут extern "C" ? Наколько я помню это всего лишь способ сообщить компилятору в каком порядке передаются аргументы внешней ф-ции и кто заботится об освобождении стека - вызывающий код или вызываемая ф-ия.

koTuk
()
Ответ на: комментарий от anonymous

>> А что такое Делфи?

> Делфи - это среда разработки на Паскале, в котором исторически принято считать точку с запятой за оператор и как раз не ставить её при возможности. Так что анонимус подоблажался малёх.

Вообще-то, в Паскале точка с запятой — разделитель операторов, соответственно, если бы оптимизаций не существовало в принципе, две подряд стоящие точки с запятой порождали бы nop.

trapezoid
()
Ответ на: комментарий от tailgunner

Зато я уверен что перепишу на асме так что будет работать быстрей чем с какими бы то ни было костылями компилятора.

koTuk
()
Ответ на: комментарий от koTuk

> Зато я уверен что перепишу на асме так что будет работать быстрей чем с какими бы то ни было костылями компилятора.

И что?

anonymous
()
Ответ на: комментарий от koTuk

> И вообще - при чем тут extern "C" ? Наколько я помню это всего лишь способ сообщить компилятору в каком порядке передаются аргументы внешней ф-ции и кто заботится об освобождении стека - вызывающий код или вызываемая ф-ия.

AFAIK extern "C" указывает что не надо уродовать имена функций, чем занимается С++, а порядок аргументов вещь параллельная, может быть extern "C" __fastcall или __cdecl функция.

shild
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.