2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3  След.
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 17:37 
Andrey_Kireew в сообщении #1444718 писал(а):
наверное начну с gcc4.7
Зачем? Текущая версия 9.3, последний вариант 4.7 вышел лет шесть назад.

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

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 17:52 
Pphantom в сообщении #1444738 писал(а):
Зачем?

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

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 17:56 
Andrey_Kireew в сообщении #1444743 писал(а):
у меня matlab2014, более высокие версии он не поддерживает
Хорошо, но, наверное, с этого нужно было начинать (поскольку это ограничивает не только версию компилятора, но и другие возможные решения).

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 18:23 
А точно нельзя подключить произвольную dll со своей функцией, скомпилённую буквально чем угодно? Как-то это странно, ведь интерфейс с dll стандартизирован чёрти как давно.

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

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

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

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

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

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 19:49 
Вообще-то вынос функций в dll дело вполне обычное, но если Вам не подходит — дело Ваше.
Я пока продолжаю сомневаться что ускорение конкретно этого цикла в 8 раз даст такой же прирост общей скорости (слишком много причин этому не быть), но без изучения окружения этого цикла не разобраться. Попробовали бы уменьшить длину цикла в 8 раз (идти по массивам с шагом 8 элементов) без изменения прочей программы и проверить возможное ускорение, без всяких телодвижений с компиляторами. Но и это Вам надо (или не надо), не мне. Хотите идти сложной дорогой — успехов.

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 20:07 
Dmitriy40 в сообщении #1444768 писал(а):
Попробовали бы уменьшить длину цикла в 8 раз

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

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

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

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение13.03.2020, 22:29 
"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 
Покопался, в 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 
Ну а у меня, к сожалению, с gcc4.7 всё закончилось плохо, так он и не заработал, наверное дистрибутив плохой попался, а нормальный так нигде и не нашел. В общем, хорошо хоть к исходному состоянию удалось всё вернуть.

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

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

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

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение16.03.2020, 02:23 
Если mingv установлен не в корневую директорию, то может мешать наличие пробела в путях к файлам

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

 
 
 
 Re: Сверхскоростное перемножение массивов
Сообщение16.03.2020, 05:47 
Да, если у Вас итерации с числами double, то ускорение должно быть 4х (но не обязательно ровно 4). И я его наблюдал в своём асм коде, с 0.96мкс до 0.28мкс, 3.4раза. Меньше 4х возможно из-за погрешностей измерения.

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

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

 
 
 [ Сообщений: 31 ]  На страницу Пред.  1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group