Фон для запроса этого вопроса заключается в том, что я решаю систему линеаризованных уравнений (Ax = b), где A - матрица (обычно размерности меньше 100x100), а x и b - векторы. Я использую прямой метод, означающий, что сначала инвертирую A, затем нахожу решение x = A^(- 1) b. Этот шаг повторяется в итеративном процессе до сближения.Вопрос о производительности: инвертирование массива указателей на месте по отношению к массиву значений
Как я делаю это сейчас, используя матричную библиотеку (MTL4):
Для каждой итерации я скопировать все coeffiecients А (значения), чтобы объект матрицы, а затем инвертировать. Это самый простой и безопасный вариант.
Используя массив указателей вместо:
Для моего конкретного случая, коэффициентов случаться обновляться между каждой итерации. Эти коэффициенты хранятся в разных переменных (некоторые - массивы, некоторые - нет). Будет ли потенциал для увеличения производительности, если я настрою A как массив, содержащий указатели на эти коэффициенты, а затем инвертирует A на месте?
Самое приятное в последнем варианте заключается в том, что как только я установил указатели в A перед первой итерацией, мне не нужно было бы копировать любые значения между последовательными итерациями. Значения, на которые указывает A, будут автоматически обновляться между итерациями.
Таким образом, вопрос о производительности сводится к этому, как я вижу:
- Процесс инверсии матрицы занимает примерно столько же времени, при условии, что удаление ссылок на указатели не дорого.
- Массив указателей не требует дополнительной памяти для матрицы A, содержащей значения.
- Массив опций указателей не должен копировать все значения NxN A между каждой итерацией.
- Значения, которые указываются на массив указателей, обычно не упорядочены в памяти. Надеемся, что все значения лежат относительно близко в памяти, но * A [0] [1], как правило, не рядом с * A [0] [0] и т. Д.
Любые комментарии к этому материалу? Будет ли последнее замечание влиять на производительность отрицательно, таким образом, взвешивая положительные эффекты производительности?
Да, спасибо, я согласен. Я подготовил все для тестирования на самом деле, просто мне нужно сделать некоторые изменения, чтобы заставить его работать. Это не так просто, как указано в первом сообщении. Вот почему я хотел спросить; если у него большой потенциал, и если стоит потратить усилия на тщательное тестирование. – Anders
+1 для теста, а также эффектов кеша. По определению, указатели будут удваивать используемую память, которая повредит производительность кеша. – phkahler
Я видел разницу в производительности около 80x между наивной реализацией кэша-неосведомленности и тем, что обращает внимание на последовательность обращений к памяти. В Linux есть два хороших инструмента, один из которых называется kcachegrind (который является интерфейсом valgrind, отличным всесторонним профайлером памяти и механизмом отладчика), а другой - OProfile - множество счетчиков производительности процессора для просмотра и узнайте, как промахи прошивки и цифровая электроника влияют на вашу производительность. – qdot