времена функции Fortm Matmul с различными размерами умножения - PullRequest
2 голосов
/ 30 июня 2019

Я рассчитал время, потраченное функцией MATMUL Фортрана с различными размерами умножения (32 × 32, 64 × 64, ...), и у меня есть вопросы по поводу результатов.

ЭтоРезультаты:

SIZE ----- TIME IN SECONDS
32   -----   0,000071
64   -----   0,000032
128  -----   0,001889
256  -----   0,010866
512  -----   0,043
1024 -----   0,336
2048 -----   2,878
4096 -----  51,932
8192 ----- 405,921856

Я думаю, время должно увеличиться в 8 раз (m * 2 * n * 2 * k * 2).Я не знаю, так ли это должно быть.Если так, кто может сказать, почему это не так?

Кроме того, мы видим увеличение в 18 раз с умножением 2048 на 4096. Может ли кто-нибудь сказать мне, почему?

Я измерил время с CALL CPU_TIME() от Fortran и CALL DATE_AND_TIME() от Fortran, и оба дали очень похожие результаты.

Мой процессор - процессор AMD Phenom (tm) II X4 945 с 4 ядрами

Ответы [ 2 ]

2 голосов
/ 30 июня 2019

@ Стив прав, есть много факторов, которые влияют на производительность, особенно когда размеры данных невелики. Вот почему все ваши результаты на уровне 2048 и ниже являются почти случайными и, по сути, не имеют значения. Все или большая часть данных, вероятно, находятся в нескольких слоях кэша ЦП. Таким образом, очистка потоков ЦП и других событий, связанных с оборудованием, делает эти результаты очень искаженными. Если вы снова запустите эти тесты, вы найдете разные результаты при этих небольших размерах.

Итак, когда вы переходите с 2048 на 4096, вы получаете большой прыжок. Все данные больше не помещаются в кэш процессора. Компьютер должен загружать блоки данных из ОЗУ в кэш-память ЦП. Это объясняет большой скачок во времени.

Именно при таких размерах и больше компьютер должен выполнять более типичные операции (загружать данные, выполнять операции, сохранять данные в ОЗУ), и это производительность, которую вы получите, когда данные становятся еще больше. Именно здесь производительность становится очень стабильной по мере увеличения данных. Обратите внимание, что переход с 4096 до 8192 очень близок к ровно в 8 раз дольше. На этом этапе переход к 16384 займет почти ровно 8 раз 406 секунд.

Любой размер меньше 4096 не дает вашему компьютеру достаточно работы для точного измерения производительности.

1 голос
/ 01 июля 2019

Между каждой синхронизацией должен быть коэффициент 8, а отклонения, как правило, связаны с управлением памятью, например выравниванием кэша и размером массива кэша. Для небольших массивов могут быть накладные расходы на вызов matmul(). Тройной do -петл может быть быстрее, по крайней мере, с некоторой оптимизацией (попробуйте -O3 -march=native), и должен одинаково хорошо работать для небольших размеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...