Производительность кода определяется различными факторами, включая
поведение кэша, наличием других пользователей на машине и т.д. Здесь
описаны основные проблемы и способы их устранения:
Задача слишком велика для физической памяти. При разграничении
времени программы нужно предусматривать, чтобы
размер общей памяти процесса был меньше размера физической
памяти компьютера как минимум на 10%. Одним из способов оценить количество памяти, используемое
процессом, является системная процедура UNIX getrusage. Опция
PETSc -log_summary также выводит количество памяти, используемое
базовыми объектами PETSc, определяя этим нижний предел объема используемой
памяти. Еще одной полезной опцией является -trmalloc_log,
которая показывает всю память, включая любые массивы Фортрана в коде
приложения.
Эффекты нескольких пользователей. Если другие пользователи
выполняют задачи на тех же самых физических процессорах, на которых
профилируется программа, результаты измерения могут быть незначащими.
Перегрузка процедур измерения на некоторых машинах. На некоторых
машинах даже обращение к системным часам в ходе измерительных процедур
происходит медленно, что искажает все измерения скорости операций и времени.
Файл ${PETSC_DIR}/src/benchmarks/PetscTime.c содержит
простую тестовую программу, которая аппроксимирует количество времени,
требуемое для получения текущего времени работающей программы. На
хороших системах оно имеет порядок 1.e-6 секунд или меньше.
Задача слишком велика для достижения хорошей производительности
кэша. Некоторые машины с низкой пропускной способностью памяти (медленный
доступ) пытаются компенсировать это очень большим кэшем.
Поэтому, если существенная порция приложения помещается в кэш, программа
достигает очень высокой производительности; если же код слишком велик,
производительность заметно падает. Чтобы проанализировать, влияет
ли на ситуацию конкретный код, можно попробовать нарисовать график
скорости вычислений как функции от размера задачи. Если скорость существенно
падает в некоторой точке, то задача является слишком большой для размещения
в кэше.
Нереальные оценки времени. Нереальные оценки времени могут
возникнуть из-за других пользователей компьютера, засоренности (использования
очень большого объема виртуальной памяти, большего, чем физическая),
или страничных ошибок при начальном выполнении. На всех системах при
следовании всем вышеуказанным рекомендациям ваши временные оценки
будут отличаться от реальных не более чем на 5%.