BLAS подпрограммы в профилировщике?
Я пытаюсь профилировать некоторый код Фортрана, который вызывает GEMM
сделать матричное умножение.
Я использовал двойную точность и видел dgemm
звонки, как я и ожидал, но теперь, когда я переключился на одинарную точность, я не вижу sgemm
вообще где угодно в профилировщике.
Если честно, я не понимаю, как даже dgemm
появился. Не нужно ли скомпилировать библиотеки BLAS -pg
создать необходимые символы?
Это использует intel MKL для библиотек BLAS и gprof для профилировщика.
1 ответ
Во-первых, я не рекомендую gprof. Мало того, что он много пропускает, но он вводит вас в заблуждение о производительности, сосредотачиваясь на рутинах, а не на том, почему программа делает то, что делает.
Я использую случайную паузу. Вот подробное обсуждение проблемы, похожей на вашу. Суть DGEMM в том, что он работает настолько быстро, насколько это возможно, учитывая, что он разработан, чтобы быть гибким, прежде всего, не быстрым. Так, например, если ваша программа тратит большую часть своего времени на умножение маленьких матриц, таких как 3x3, процедура DGEMM может фактически тратить 2/3 своего времени на проверку своих флагов аргументов и только 1/3 фактически умножения. Если вы знаете это, то вы можете легко написать свой собственный специальный множитель и получить значительное ускорение. Это то, что случайная пауза и выборка стека вызовов скажут вам.