2014-12-18 4 views
0

Я пытаюсь оптимизировать часть кода, которая вызывается в параллельной области (OpenMP). Я проанализировал доступ к памяти с помощью Intel VTune Amplifier 2015 и немного смутил результат. Я повторил анализы с уровнями оптимизации O1, O2 и O3 с Intel Composer 2015, но результат тот же. Требования Amplifier, что большинство ООО промахов появляются в следующих трех направлениях:Что вызывает пропуски кеша в моем коде?

__attribute__ ((aligned(64))) double  x[4] = {1.e0,-1.e0, 0.e0, 0.e0}; 
__attribute__ ((aligned(64))) double  y[4] = {0.e0,-1.e0, 1.e0, 0.e0}; 
__attribute__ ((aligned(64))) double  z[4] = {0.e0, 0.e0,-1.e0, 1.e0}; 

Данных выравниваются, так как он доступен позже в векторизованной коде. Я не могу опубликовать весь код здесь, потому что у него есть авторское право. Это около 75% от общего количества промахов кэша в этой функции, хотя в коде есть много вычислений и других массивов. Для O0-оптимизации я получаю гораздо более реалистичные результаты, потому что там, где линии, как

res[a] += tempres[start + b] * fact; 

Но там все исполнение требует гораздо больше времени (что понятно). Но какие результаты я могу доверять? Или какое альтернативное программное обеспечение можно использовать для тестирования.

Заранее благодарен!

+0

[cachegrind] (http://valgrind.org/docs/manual/cg-manual.html) - еще один инструмент, если вы хотите проверить результат. – Matt

+0

Сколько промахов кэша вы получаете за выполнение функции? Устанавливает ли инструмент teml то, являются ли эти пропуски i- или d-cache? – MikeMB

+0

Является ли эта функция вызванной в замкнутом цикле? – MikeMB

ответ

0

Ищите только проценты, которые могут вводить в заблуждение (75% от 100 меньше, чем 10% от 1000) - вам нужно посмотреть абсолютное количество промахов при сравнении.

Поведение кэша также сложно реализовать, особенно в сочетании с оптимизацией компилятора и конвейерами CPU.
Похоже, что оптимизированные сборки в основном пропускают кеш при инициализации (не слишком удивительно, что он это делает), но удается сохранить почти весь расчет в кеше, поэтому я не вижу здесь проблемы.

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

Поиск инструмента, который подтверждает ваше ожидание, в значительной степени пустая трата времени, так как вы не можете быть уверены, что , что инструмент не тот, который по ошибке.

+0

Спасибо, до сих пор молбднило. Эта часть кода также имеет большинство кафемисов в абсолютных значениях. Я должен подсчитать частоту, вызванную функцией, и сравнить ее снова. – user3572032

+0

@ user3572032 Конечно, у него есть - вы должны сравнить абсолютные значения между оптимизированными и неоптимизированными сборками, используя один и тот же ввод. – molbdnilo