Я пытаюсь оптимизировать часть кода, которая вызывается в параллельной области (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;
Но там все исполнение требует гораздо больше времени (что понятно). Но какие результаты я могу доверять? Или какое альтернативное программное обеспечение можно использовать для тестирования.
Заранее благодарен!
[cachegrind] (http://valgrind.org/docs/manual/cg-manual.html) - еще один инструмент, если вы хотите проверить результат. – Matt
Сколько промахов кэша вы получаете за выполнение функции? Устанавливает ли инструмент teml то, являются ли эти пропуски i- или d-cache? – MikeMB
Является ли эта функция вызванной в замкнутом цикле? – MikeMB