23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
|
||||||
1 | ||||||
Увеличение производительности за счет кэш-памяти и конвейерности процессора03.03.2017, 03:25. Показов 1284. Ответов 2
Метки нет Все метки)
(
Читаю тут одну книгу и не понимаю.
Перемножают матрицы. И говорят. Ну вот, если будем перемножать как обычно большие матрицы С=AB, то т.к. матрица представлена в памяти в виде строки ее элементов, эти А и В в кэш-память не влезет, поэтому удобно представить их в виде блоков матриц. (блок - минор меньшей размерности, для простоты NxN и будем считать, что А,В nxn, n делится на N) И значит будем эти самые блоки и перемножать. Тогда Сim = Aij Bjm (тут подразумевается соглашение Эйнштейна - т.е. суммируем по j, а Dab - это миноры матрицы D NxN) Ну и так как мы перемножаем эти самые миноры, у нас они все влазят в кэш-память, и процесс перемножения ускоряется, для разных процессоров во-разному, но вот взяли они какой-то пример и на третьем пентиуме получилось, аж в 7,6 раз быстрее. А дальше вообще какая-то жесть. Пишут: Вспомним, что все современные процессоры имеют конвейер инструкций, причем весьма глубокий (может доходить до полутора десятков стадий). Для его заполнения длина линейного участка программы (т.е. не содержащих перехода) должна быть как минимум больше глубины конвейера (желательно - в несколько раз больше). В предыдущем варианте в самом внутреннем цикле находится 1 оператор языка С.
Для увеличения длины линейного участка программы "развернем" цикл в предыдущем варианте: за один виток по j будем вычислять сразу по 4 элемента матрицы С. ci,m, ci+1,m, ci,m+1, ci+1,m+1. Поскольку при их вычислении используются повторяющиеся элементы матриц А,В, то также появляются дополнительные резервы для ускорения работы за счет оптимизации компилятора и кэш-памяти. И таким образом, они ускоряют программу умножения матриц, по сравнению с самым естественным вариантом (строка*столбец) в 13,8 раз. Скажите, правильно ли я понимаю, что для того, чтобы ускорить программу за счет конвейерности, мне нужно знать длину этого конвейера? Как узнать эту длину на моем компьютере, и как вообще узнать во сколько инструкций транслируются те или иные команды? Что такое длина линейного участка я так и не понял. А если попроще, могу ли я ускорить вот так вот что-либо напихав внутрь цикла побольше операций?
0
|
|
03.03.2017, 03:25 | |
Ответы с готовыми решениями:
2
Увеличение производительности оперативной памяти
Определить наличие кэш памяти процессора и его параметров (ассемблерные вставки) 1С - увеличение производительности бизнеса |
7529 / 6394 / 2914
Регистрация: 14.04.2014
Сообщений: 27,855
|
|
03.03.2017, 10:02 | 2 |
Документацию на процессор читать, наверное.
0
|
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
|
|
03.03.2017, 16:57 [ТС] | 3 |
Ну а что такое линейный участок и чем это вообще отличается от раскрытия цикла?
Если на пальцах, то кажется, что было: ...-> i++ -> проверка цикла -> оператор -> i++ -> проверка цикла -> оператор -> и т.д. Стало: i++ -> проверка цикла -> оператор -> оператор -> оператор -> оператор -> i++ -> проверка цикла -> оператор -> оператор -> оператор -> оператор ->... Т.е. процессор затрачивает меньше времени на цикл for. Но они там говорят, что этот оператор транслируется компилятором с учетом обслуживания цикла, и почему-то кажется, что имеется в виду, цикл здесь ни при чем. И еще кажется, что компилятор такие штуки сам должен оптимизировать, потому что в обратном случае это как-то странно, можно сделать вывод, что лучше от циклов вообще отказаться: чем больше операторов внутри, тем меньше времени затрачивается на обслуживание цикла. - Я не знаю, эта книга какая-то сложная для понимания. И если так, то при чем здесь тогда вообще конвейерность?
0
|
03.03.2017, 16:57 | |
Помогаю со студенческими работами здесь
3
Кластеры и увеличение производительности Увеличение производительности ПК для Ведьмака 3 HP pavilion G6-2054ER; увеличение производительности кэш процессора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |