2015-11-13 7 views
1

Я пишу программу на C, которая выполняет умножение матрицы 50x50.Почему перфект показывает меньше событий с плавающей запятой, чем ожидалось?

Я скомпилировал его для сборки, и я вижу, что он имеет как минимум 2 команды с плавающей запятой (mulsd и addedd) в самом внутреннем цикле. Цикл выполняется 125000 раз, поэтому я ожидал, что perf stat даст мне как минимум 250000 операций с плавающей запятой.

Однако, когда я запускаю следующую команду,

perf stat -e r530110 -e r531010 -e r532010 -e r534010 -e r538010 ./matmul 

я только получить следующие счетчики

  448 r530110              
      0 r531010              
      0 r532010              
      0 r534010              
<not counted> r538010     

    0.001082287 seconds time elapsed 

Мой компилятор не дает инструкции SSE, так что другие нулевые отсчеты, как ожидается. Тем не менее, я получил только 448 операций с плавающей запятой.

Что происходит?

+0

Просьба представить минимальный пример и дать нам код сборки. Если вы это сделаете, вы, скорее всего, ответите на свой вопрос. –

+0

Также уточните заголовки: что такое «подозрительный»? :-) Я пробовал редактировать его, чтобы улучшить. –

ответ

2

Я понял это. Я неправильно понял: mulsd и addsd являются инструкциями SSE.

Стат r530110 (FP_COMPS_OPS_EXE: X87) не учитывается mulsd или addsd.

Мне нужно было посмотреть r538010 (FP_COMPS_OPS: SSE_SCALAR_DOUBLE).

Мое предположение по той причине, что это были <not counted> в моей программе, потому что программа закончилась слишком быстро. Когда я увеличил размер матрицы (так что программа работает дольше), количество событий с плавающей запятой получилось правильным.