2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 17:37 
Заслуженный участник


09/05/12
25179
Andrey_Kireew в сообщении #1444718 писал(а):
наверное начну с gcc4.7
Зачем? Текущая версия 9.3, последний вариант 4.7 вышел лет шесть назад.

P.S. Вообще, похоже, все подобные темы нужно начинать с вопроса про компиляторы (свежесть, качество и т.п.). Что-либо обсуждать стоит тогда, когда тут все в порядке (или есть внятная причина, по которой используемое ПО нельзя обновить).

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 17:52 


07/10/15

2400
Pphantom в сообщении #1444738 писал(а):
Зачем?

у меня matlab2014, более высокие версии он не поддерживает

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 17:56 
Заслуженный участник


09/05/12
25179
Andrey_Kireew в сообщении #1444743 писал(а):
у меня matlab2014, более высокие версии он не поддерживает
Хорошо, но, наверное, с этого нужно было начинать (поскольку это ограничивает не только версию компилятора, но и другие возможные решения).

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 18:23 
Заслуженный участник


20/08/14
11170
Россия, Москва
А точно нельзя подключить произвольную dll со своей функцией, скомпилённую буквально чем угодно? Как-то это странно, ведь интерфейс с dll стандартизирован чёрти как давно.

PS. А я бы подобные темы начинал с вопроса "как установили что тормозит именно это?". Часто это лишь весьма смутное предположение и о корректности постановки эксперимента речи не идёт. :-(

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 19:13 


07/10/15

2400
Dmitriy40 в сообщении #1444754 писал(а):
А точно нельзя подключить произвольную dll со своей функцией, скомпилённую буквально чем угодно?

Всё это конечно же можно, но смысла особого в этом я не вижу. Опять же, dll эта повсюду будет "бултыхаться", а так всё в одном файле. В общем, мне так больше нравится, а dll я использую, только в крайних случаях, когда без этого просто не обойтись.
Обновление компилятора до gcc4.7 мне сейчас представляется наиболее оптимальным, т.к. это не повлечёт за собой каких либо серьёзных последствий, но в тоже время предоставит много новых возможностей: AVX2, С++11, и т.п.
Можно было бы конечно поставить VC2013, в нём кажется тоже всё это есть, но ещё неизвестно, как это повлияет на ранее установленный VC2010, а его и всё что с ним связано, я хочу сохранить.

Dmitriy40 в сообщении #1444754 писал(а):
А я бы подобные темы начинал с вопроса "как установили что тормозит именно это?"

такого вопроса даже не стоит, с этим вопросом как раз мне всё предельно ясно, тормозит именно это. Вернее сказать даже не тормозит, а в это всё упирается. Сильно ускорить эту часть, как я уже понял, не получится - такой алгоритм. Надо попробовать подключить blas и AVX, интересно посмотреть, какой выигрыш даст то и другое.

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 19:49 
Заслуженный участник


20/08/14
11170
Россия, Москва
Вообще-то вынос функций в dll дело вполне обычное, но если Вам не подходит — дело Ваше.
Я пока продолжаю сомневаться что ускорение конкретно этого цикла в 8 раз даст такой же прирост общей скорости (слишком много причин этому не быть), но без изучения окружения этого цикла не разобраться. Попробовали бы уменьшить длину цикла в 8 раз (идти по массивам с шагом 8 элементов) без изменения прочей программы и проверить возможное ускорение, без всяких телодвижений с компиляторами. Но и это Вам надо (или не надо), не мне. Хотите идти сложной дорогой — успехов.

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 20:07 


07/10/15

2400
Dmitriy40 в сообщении #1444768 писал(а):
Попробовали бы уменьшить длину цикла в 8 раз

я же в самом начале писал, время выполнения этого цикла 98% от общего времени выполнения программы (измерено с помощью clock() - может и не точно, но всё равно, порядок чисел очевиден), а в этом цикле ничего кроме перемножения и суммирования 2-х векторов нет. Раньше я думал - может с кэш проблемы, но Вы сами пишите, что такого быть не должно. Какой смысл экспериментировать, если и так всё ясно?

Dmitriy40 в сообщении #1444768 писал(а):
Я пока продолжаю сомневаться что ускорение конкретно этого цикла в 8 раз даст такой же прирост общей скорости

Вот именно это для меня вполне очевидно, я даже сбрею усы если такого не произойдёт. Жаль, что в 8 раз ускорить эту часть наверное не получится

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 22:29 
Заслуженный участник


20/08/14
11170
Россия, Москва
"8 раз" я взял не с потолка, это отношение 15 млрд теоретической скорости векторного цикла к измеренным Вами 2 млрд.
Чтобы не быть совсем голословным, написал быстренько тест (асм x64), вышло на FPU 0.91мкс, на SSE скалярно 0.96мкс, на AVX векторно (без FMA) 0.28мкс, на FMA 0.24мкс, это цифры на 2048 double итераций. Должно быть вчетверо при 4х векторизации, достигнуто в 3-4 раза. На удивление скорость тоже составила около 2.2 млрд скалярных итераций в секунду (на 3.5ГГц), где-то всё же лишняя команда в один такт не укладывается. 15млрд не вышло, лишь 7-8 млрд double итераций в секунду, но можно ещё покопаться в причинах.

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение14.03.2020, 04:23 
Заслуженный участник


20/08/14
11170
Россия, Москва
Покопался, в Intel(R) Architecture Code Analyzer, интересные вещи обнаруживаются: для FST дают порты 2/3 вместо 4+7; во всех случаях тормозит FrontEnd (6-8 микроопераций не могут запуститься за такт), хотя исполнительных портов хватает (кроме варианта FPU). И в результате скорость не 1 такт на 1 или 4 итерации, а 1.5-1.75 такта. Что собственно и видим.
Попытка развернуть цикл приводит к замедлению, хотя анализатор выдаёт возрастание скорости, похоже срабатывает ограничение на 4 микрооперации за такт из кэша микроопераций в ReOrder Buffer.
В общем я не знаю как выжать пиковую вычислительную производительность, слишком простая задача, максимум получается лишь 8 млрд double итераций в секунду (командой FMA), вдвое меньше пиковой. Соответственно и в скалярном режиме выше 2 млрд double итераций в секунду (хоть FPU, хоть SSE) не выжать.

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение14.03.2020, 06:49 


07/10/15

2400
Ну а у меня, к сожалению, с gcc4.7 всё закончилось плохо, так он и не заработал, наверное дистрибутив плохой попался, а нормальный так нигде и не нашел. В общем, хорошо хоть к исходному состоянию удалось всё вернуть.

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение14.03.2020, 22:16 


07/10/15

2400
В общем простой AVX оказывается есть и с vc2010. Я подключил, но прирост производительности всего 10%. Опции компилятора были /O2 /Oy-. Пробовал менять, в том числе на /О3, производительность упала ровно в 4 раза. Такое впечатление, будто бы это связано с SSE.

mingw4.7 я кое как подключил, но он опять не работает, в самом конце прцесса компиляции выдаёт ошибку
Код:
Error : "x86_64-w64-mingw32-g++" ­не является вн­утренн­­ей или вн­ешн­ей командой, испол­няемой программой или пакетным файлом

все пути вроде как прописаны, при запуске из папки компилятора g++ --version выдаёт нормальное сообщение,
даже и не знаю, в чём может быть дело

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение16.03.2020, 02:23 


16/04/19
161
Если mingv установлен не в корневую директорию, то может мешать наличие пробела в путях к файлам

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение16.03.2020, 03:26 


07/10/15

2400
В общем, удалось кое как подключить gcc4.9.2. Как я уже писал в соседней ветке, с настройками по умолчанию, программа работает на 20% быстрее, чем с msvc2010. Подключил AVX2 (директива -march=core-avx2). Получил ускорение в 2 раза. Теперь, скорость выполнения 4 млрд. оп./сек. Но это ведь уже не скалярный режим, правильно ли я понимаю Dmitriy40, что здесь должен быть прирост не в 2 а в 4 раза?

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение16.03.2020, 05:47 
Заслуженный участник


20/08/14
11170
Россия, Москва
Да, если у Вас итерации с числами double, то ускорение должно быть 4х (но не обязательно ровно 4). И я его наблюдал в своём асм коде, с 0.96мкс до 0.28мкс, 3.4раза. Меньше 4х возможно из-за погрешностей измерения.

 Профиль  
                  
 
 Re: Сверхскоростное перемножение массивов
Сообщение16.03.2020, 08:05 


07/10/15

2400
Dmitriy40 в сообщении #1445081 писал(а):
Да, если у Вас итерации с числами double, то ускорение должно быть 4х

Тогда нужно будет ещё попробовать blas, интересно, насколько ещё удастся приблизиться к этому пределу

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group