|
|
|
Перемножение матриц - как быстрее?
|
|||
|---|---|---|---|
|
#18+
Всем привет. Заинтересовался GPGPU, но для начала неплохо бы понять, от чего отталкиваться. Написал простое перемножение матриц для float. Ниже речь только про однопоток. На яве и плюсах скорость примерно одинакова (7-8 секунд) для [1024х1024] (проц i5-2500) В флопсах это просто ужас - вроде ~300 Мегафлопс (могу ошибаться), хотя доступ к памяти достаточно предсказуемый. В общем, кто может подсказать по опциям компилятора, etc - велкам! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 17:39 |
|
||
|
Перемножение матриц - как быстрее?
|
|||
|---|---|---|---|
|
#18+
tolyanchikНаписал простое перемножение матриц для float.1.Я бы начал с алгоритма перемножения - как известно, именно в алгоритме скрываются лучшие возможности оптимизации. Соответственно, лучше взять готовую библиотеку чем делать свое простое. Например, симметричные матрицы хранятся и перемножаются совсем по- другому, чем несимметричные. Сильно разреженные - по-третьему. 2. Использовать double вместо float. Во-первых мат.процессоры работают с длинными числами, и float операнды сначала преобразуются в double, делается операция и потом результат преобразуется обратно во float. Теряется время. Во вторых - перемножение матриц, это из тех алгоритмов, в которых значительно теряется точность при вычислениях, и надо обязательно иметь запас прочности точности, в виде бОльшего количества битов для хранения числа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2014, 12:38 |
|
||
|
Перемножение матриц - как быстрее?
|
|||
|---|---|---|---|
|
#18+
S.G.Использовать double вместо float. Во-первых мат.процессоры работают с длинными числами, и float операнды сначала преобразуются в double, делается операция и потом результат преобразуется обратно во float. Теряется время. да неужели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2014, 12:52 |
|
||
|
Перемножение матриц - как быстрее?
|
|||
|---|---|---|---|
|
#18+
tolyanchik, Перед работой с большими массивами данных имеет смысл изучить устройство памяти того железа, с которым будешь работать. После этого станет понятно, как эффективнее хранить данные для решения конкретной задачи и в какой последовательности их обрабатывать. Ну и все время необходимо помнить, что один и тот же результат можно получить 1024 различными способами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2014, 14:39 |
|
||
|
Перемножение матриц - как быстрее?
|
|||
|---|---|---|---|
|
#18+
ИзопропилS.G.Использовать double вместо float. Во-первых мат.процессоры работают с длинными числами, и float операнды сначала преобразуются в double, делается операция и потом результат преобразуется обратно во float. Теряется время. да неужели?авторВнутри FPU числа хранятся в 80-битном формате с плавающей запятой, для записи же или чтения из памяти могут использоваться: Вещественные числа в трёх форматах: коротком (32 бита), длинном (64 бита) и расширенном (80 бит).То есть, все что меньше 80 бит, растягивается до 80 бит. На самом деле, да, я не совсем прав, так как во-первых имел ввиду не "double" а 80 бит "long double", (то есть "extended" в паскале), и да, может быть чтение-запись этих длинных 80 битных чисел может замедлить процесс и уничтожить плюсы от не-растягивания длинных чисел в FPU. Во всяком случае, все это неплохо иметь ввиду, и автору как-раз сейчас время попробовать разные варианты ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2014, 15:25 |
|
||
|
Перемножение матриц - как быстрее?
|
|||
|---|---|---|---|
|
#18+
S.G.То есть, все что меньше 80 бит, растягивается до 80 бит. заканчивается 2014 год.... преобразование single-double на регистрах задержки не вносит, а вот удвоение объёма данных существенно для любой архитектуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2014, 16:22 |
|
||
|
Перемножение матриц - как быстрее?
|
|||
|---|---|---|---|
|
#18+
tolyanchikВсем привет. Заинтересовался GPGPU, но для начала неплохо бы понять, от чего отталкиваться. Написал простое перемножение матриц для float. Ниже речь только про однопоток. Толянчик. Умножение двух матриц - это классическая задача на мультипроцессность-мультипоточность. Смысл правильной оптимизации - порезать матрицу A на прямогольники и матрицу B и соотвесттвенно перемножать с параллельной записью резалта в матрицу C. Поэтому про однопоток говорить неинтересно. Алгоритм там известен и весьма стационарен. Можно лишь жонглировать техниками оптимизаций машинных команд на уровне железа и получать различные приросты в операциях ADD/MUL или в спаривании команд или в векторизации. GpGPU я не использовал поэтому как там оно делается - не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2014, 17:13 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38787301&tid=1341181]: |
0ms |
get settings: |
5ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
145ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 438ms |

| 0 / 0 |
