Форум программистов, компьютерный форум, киберфорум
Низкоуровневое программирование
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
1

Выжать из процессора максимум

03.03.2018, 11:02. Показов 2833. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Необходимо написать одноразовую вычислительную программу (До безобразия просто: операции с целыми положительными числами размера 8 байт; два цикла: один вложен в другой; три переменных, не считая временных). Но объём данных очень большой, поэтому хочется задействовать процессор полностью (Все переменные по возможности регистровые и т.д.). В Assembler новичок, поэтому сразу возникает много вопросов:
1) Процессор AMD Phenom(tm) II P820 Triple-Core Processor 1.79 GHz
ОС Windows 7 x64
Какой компилятор и среду разработки выбрать(MASM, FASM, TASM, GAS и т.д.)?
2) Какого прироста производительности можно ожидать(По сравнению с реализацией на ЯВУ типа c++)?
3) Необходимо увеличивать счётчик цикла до кв. корня из переменной("потолка"). Какая реализация на Assembler быстрее:
на каждой итерации (их будет более 10^10) сравнивать квадрат счётчика с "потолком" или
перед циклом высчитать корень из "потолка"(8 байтного целого числа) и на каждой итерации сравнивать с ним (если второй вариант быстрее, то как его реализовать эффективнее?)
4) Необходимо выполнять условный переход, если одно значение делится(без остатка) на другое. Как эффективно реализовать? (Все числа нечётные: не делятся на 2)
5) В процессоре 3 ядра, как их все задействовать? Если просто запустить 3 одинаковых программы одновременно(с разным набором данных), то можно ли ожидать увеличения общей производительности в 3 раза?
6) Насколько замедляет ОС действие программ? (т.е. если запустить ту же программу без ОС, то во сколько раз она будет быстрее работать?)

Добавлено через 10 минут
И какую литературу и/или прочие материалы вы посоветовали бы почитать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2018, 11:02
Ответы с готовыми решениями:

Выжать максимум с sape
Вообщем вопрос такой. Как именно можно выжать по максимуму в сапе, т.е. продать 99 % мест с...

Выжать максимум из бесплатного продвижения
Собственно, сабж: http://www.izotex.spb.ru/ Сваял полностью своими руками с нуля, раньше никогда...

Выжать максимум из 90 тысяч на сегодняшний день :(
В общем, есть 90 тысяч (ну ещё пара штук наберется) - нужен системник, на ближайшие 4 года...

Выжать максимум с платы ECS C19-A
Вообщем на руках имеется достаточно старенький аппарат 2006 года: Материнская плата ECS C19-A SLI ...

16
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
03.03.2018, 11:38 2
orAnd, дождитесь модератора.. у него сегодня выходной.. он обычно все переришивает в конце недели..
3
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
03.03.2018, 11:44  [ТС] 3
proc3nt, спасибо за позитивный настрой!
0
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
03.03.2018, 11:54 4
а пока пьете просмотрите Библиографический список
2
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
03.03.2018, 12:13 5
orAnd, обычно прирост производительности дают алгоритмы, а переписывание на ассемблер эффект, конечно же, имеет, но уже не столь значительный.
Значительного эффекта при переходе к ассемблеру можно добиться при использовании специфических команд процессора (наборы SIMD, наборы инструкций обработки бит, инструкции для исключения условных переходов при сравнениях).
1) FASM или MASM64 и пробовать создать программу под x64
2) если не использовать инструкции SIMD, то прироста скорости почти не будет
3) нужно поискать в интернете алгоритмы целочисленного извлечения квадратного корня и попробовать преобразовать их к командам SIMD. Помимо классических (итерации по Ньютону, сумма нечётных) существуют и быстрые с использованием магических чисел - на Хабрахабре видел описание такого в пределах 2017 года.
4) выполняйте переход, кто же запрещает?
5) средствами ОС. Тут нечего сказать не могу, т.к. не интересовался и не знаю. Читал, что для распараллеливания математических расчётов применяют библиотеку OpenMP.
6) сложно сказать. Конечно замедляется, но и в DOS происходят немаскируемые прерывания, меняющие результаты замеров.

Остаётся ощущение о задаче поиска простых чисел. Если нужно не факторизовывать числа, а только проверять на простоту - можно воспользоваться вероятностными критериями простоты. А если факторизовывать - то почитать об алгоритмах факторизации.
Как всегда - первичны алгоритмы.

К задаче поиска простых чисел примыкают задачи криптографии. Поэтому сразу предупреждаю - обсуждение взлома на форуме запрещено.
1
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
03.03.2018, 12:35  [ТС] 6
Спасибо.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Остаётся ощущение о задаче поиска простых чисел
Действительно, можно подумать почитав мои вопросы, но простые числа я искать не собираюсь.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
взлома
Нет, я о таком и не думал.
А где можно почитать про специфические команды?
0
642 / 151 / 60
Регистрация: 08.04.2015
Сообщений: 390
03.03.2018, 14:55 7
2) Зависит от алгоритма и от использованного компилятора ЯВУ. Примерный рост будет в 1,2-1,5 раза, больше вряд ли.

3) Конечно же, извлечь 1 раз квадратный корень до входа в цикл быстрее, чем умножать в каждом цикле. И об эффективности этого разового действия можно не заботиться, т. к. даже при неэффективной реализации влияние на общий итог будет абсолютно мизерным.

5, 6) Да, 3 копии дадут прирост почти в 3 раза. Естественно, ОС забирает некоторую часть процессорного времени, но это единицы процентов. Можно внутри одной программы создать несколько потоков, по производительности будет примерно то же, как несколько однопоточных копий, но в реализации сложнее.

Не совсем в тему. Если вычисления можно распараллелить, то современные видеокарты позволяют выполнять их в сотни и тысячи раз быстрее, чем CPU. И код для GPU можно писать на ЯВУ, ассемблер осваивать не обязательно.
1
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
03.03.2018, 17:23 8
О, у нас тут ФСБ снова решила расшифровать RSA.
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
03.03.2018, 23:27 9
Цитата Сообщение от orAnd Посмотреть сообщение
Какой компилятор и среду разработки выбрать(MASM, FASM, TASM, GAS и т.д.)?
FASM возьмите или С/С++ (компилятор GCC).

Цитата Сообщение от orAnd Посмотреть сообщение
2) Какого прироста производительности можно ожидать(По сравнению с реализацией на ЯВУ типа c++)?
Всё зависит от прямоты рук и знания C++ и ассемблера. Поэтому может быть как прирост, так и замедление. Если знать и то, и другое достаточно хорошо, разница вряд ли будет больше 5-10%, ИМХО (а трудоёмкость может отличаться в разы).
Те же SIMD инструкции можно реализовать и в C++, там же есть интринсики, с помощью которых можно фактически любую инструкцию выполнить.

Цитата Сообщение от orAnd Посмотреть сообщение
3) Необходимо увеличивать счётчик цикла до кв. корня из переменной("потолка"). Какая реализация на Assembler быстрее:
на каждой итерации (их будет более 10^10) сравнивать квадрат счётчика с "потолком" или
перед циклом высчитать корень из "потолка"(8 байтного целого числа) и на каждой итерации сравнивать с ним (если второй вариант быстрее, то как его реализовать эффективнее?)
А как вы думаете, что быстрее: выполнять умножение + сравнение на каждом цикле или только сравнение? Корень не настолько трудоёмкая операция, чтобы 10^10 умножений выполнялись быстрее...

Цитата Сообщение от orAnd Посмотреть сообщение
4) Необходимо выполнять условный переход, если одно значение делится(без остатка) на другое. Как эффективно реализовать? (Все числа нечётные: не делятся на 2)
С этим вопросом лучше в раздел алгоритмы.
Почти наверняка самый быстрый алгоритм поиска НОД будет медленнее деления.

Цитата Сообщение от orAnd Посмотреть сообщение
5) В процессоре 3 ядра, как их все задействовать? Если просто запустить 3 одинаковых программы одновременно(с разным набором данных), то можно ли ожидать увеличения общей производительности в 3 раза?
Прямо в 3 – вряд ли, но около того – да.

Цитата Сообщение от orAnd Посмотреть сообщение
6) Насколько замедляет ОС действие программ? (т.е. если запустить ту же программу без ОС, то во сколько раз она будет быстрее работать?)
Такие вопросы задаёте, что неудобно отвечать... даже ©
Существенного прироста без ОС не получите, ИМХО. Можно дать максимальный приоритет процессу и потоку и всё будет нормально (ну если, конечно, у вас не будет запущен рендер двигающегося 3D-изображения)

Цитата Сообщение от orAnd Посмотреть сообщение
Нет, я о таком и не думал.
А вы всё же подумайте
2
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
03.03.2018, 23:51  [ТС] 10
Ясно, ожидать сильного ускорения простыми средствами не стоит.
Цитата Сообщение от UnknownSoldier Посмотреть сообщение
код для GPU
Не могли бы вы дать немножко ссылок для мягкого старта? На чём лучше писать (C и OpenCL, C++ AMP и т.д.)? Какого ускорения можно ожидать при задействовании AMD Radeon HD 6500M/5600/5700 Series?
Заранее спасибо.
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
04.03.2018, 00:05 11
Цитата Сообщение от orAnd Посмотреть сообщение
Какого ускорения можно ожидать при задействовании AMD Radeon HD 6500M/5600/5700 Series?
Вы реально хотите найти тут людей, которые специально вычисляли скорость математических операций на "AMD Phenom(tm) II P820 Triple-Core Processor 1.79 GHz" и на "AMD Radeon HD 6500M/5600/5700 Series" и получить какой-то коэффициент прироста?
Я вам могу только посоветовать что-то типа такого (для сравнения процессоров): http://www.cpubenchmark.net/CPU_mega_page.html
К тому же, про какое ускорение вы спрашиваете: ускорение чего? Где алгоритм вашей программы? Как можно сравнивать на разных ЯП, архитектурах и пр. то, не знаю что? Какой-то гипотетический код.
Да и вы же не думаете, что на процессоре X любой код будет выполняться всегда в N раз быстрее или медленнее, чем на процессоре Y ? Вне зависимости от того, что там написано...

Цитата Сообщение от orAnd Посмотреть сообщение
Не могли бы вы дать немножко ссылок для мягкого старта?
CUDA ещё посмотрите.
Вот ссылка, куда смотреть
Или вот: https://habrahabr.ru/post/96122/ (всё легко находится в Я)
1
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
04.03.2018, 00:22  [ТС] 12
Цитата Сообщение от Jin X Посмотреть сообщение
Да и вы же не думаете, что на процессоре X любой код будет выполняться всегда в N раз быстрее или медленнее, чем на процессоре Y ? Вне зависимости от того, что там написано...
Там будет написано приблизительно это:
Цитата Сообщение от orAnd Посмотреть сообщение
операции с целыми положительными числами размера 8 байт; два цикла: один вложен в другой; три переменных, не считая временных
Циклы очень большие ~1020
Я же не прошу точного значения N мне бы лишь порядок... Хотя это больше из любопытства.
Цитата Сообщение от Jin X Посмотреть сообщение
CUDA ещё посмотрите.
Возможно я ошибаюсь, но CUDA же только для NVIDIA?
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
04.03.2018, 00:28 13
Так нам господин orAnd в итоге скажет, зачем он собрался факторизовывать RSA-64?
Обыграть онлайн-казино, расковыряв последовательность рулетки?
Распаковать архив с голыми фотками бывшей, который она коварно зашифровала?
Где вообще сегодня может использоваться ключ, вскрытый ещё 15 лет назад?
0
117 / 101 / 53
Регистрация: 13.04.2014
Сообщений: 233
04.03.2018, 00:34  [ТС] 14
Kukuxumushu, уверяю вас, я не собираюсь ничего факторизовывать, взламывать или расшифровывать.
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
04.03.2018, 00:43 15
Цитата Сообщение от orAnd Посмотреть сообщение
ничего факторизовывать
У вас в первом посте стоит задача факторизации, которая используется фактически только в алгоритме дешифровки RSA.
И я сейчас за 10 минут накидал ваш код для 8-байтного числа - оно у меня на 1 ядре i3 M370 полностью перебралось секунд за 10 с выдачей ответа. А вам-то чего надо? За 0,01 сек, чтобы пачками сразу факторизовывать?
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
04.03.2018, 02:23 16
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
К задаче поиска простых чисел примыкают задачи криптографии. Поэтому сразу предупреждаю - обсуждение взлома на форуме запрещено.
Так в разделе "криптография" только этим и занимаются.

Добавлено через 13 минут
Цитата Сообщение от orAnd Посмотреть сообщение
Циклы очень большие ~1020
Я же не прошу точного значения N мне бы лишь порядок... Хотя это больше из любопытства.
Так порядок Вы и сами можете прикинуть. Компьютер типично перебирает миллион вариантов чего-нибудь в секунду. Распараллеливание в GPU даст прирост ну может на пару-тройку порядков. После прикидывается Х к Н и вычисляется по порядку величины сколько миллионов лет потребуется.
Грубо говоря у вас 20-й порядок. Скинули 9 порядков, чтобы получить секунды. Скинули 7 порядков, чтобы получить года. Убедились, что столько не живут.

Добавлено через 2 минуты
В общем оптимизация не в ассемблере, оптимизация в алгоритме. Придумайте алгоритм в котором на порядки меньше надо было бы перебирать и все ништяки Ваши.
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
04.03.2018, 08:07 17
Цитата Сообщение от orAnd Посмотреть сообщение
Там будет написано приблизительно это
Я думаю, раз в 10, 100 или 1000 (приблизительно)
Всё сильно зависит от производительности видеокарты и ЦП.
Поищите, например, инфу о производительности в GFlops'ах ваших процессоров CPU и GPU. И сравните. Получите порядок.

Цитата Сообщение от orAnd Посмотреть сообщение
Возможно я ошибаюсь, но CUDA же только для NVIDIA?
А ну да, у вас же AMD. Ну тогда OpenCL, наверное.

Цитата Сообщение от Ethereal Посмотреть сообщение
Грубо говоря у вас 20-й порядок. Скинули 9 порядков, чтобы получить секунды. Скинули 7 порядков, чтобы получить года. Убедились, что столько не живут.

В общем оптимизация не в ассемблере, оптимизация в алгоритме. Придумайте алгоритм в котором на порядки меньше надо было бы перебирать и все ништяки Ваши.
Примерно так и есть
"Скинули 9 порядков" – это если у вас 1 операция занимает наносекунду, т.е. выполняется 1 млрд операций в секунду.
Покупайте какой-нибудь GeForce GTX 1080 Ti и сэкономите больше времени
1
04.03.2018, 08:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2018, 08:07
Помогаю со студенческими работами здесь

Апгрейд ПК или как выжать максимум из своей системы
Добрый вечер, прошу помочь советом по улучшению компьютера... Самая на мой взгляд сложная задача...

Выжать максимум из железа: core 2 duo E6850,2*1024 PC6400 micron d9gmh,geforce 8800 gtx
появилась новая машинка. хочется выжать масимум системники: core 2 duo E6850 foxconn mars (inel...

Даны действительные числа х, у, z Вычислить максимум (x.y) + максимум (y.z) + максимум (х z)
1. Даны действительные числа х, у, z Вычислить максимум(x.y) + максимум(y.z) + максимум(х z) ...

Апгрейд выжать до максимума
Добрый день, есть тут кто сможет мне помочь выжать максимум, ситуация такая, есть достойный корпус,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru