Вопрос производительности: инвертирование массива указателей на месте против массива значений - PullRequest
1 голос
/ 11 января 2011

Предпосылкой для постановки этого вопроса является то, что я решаю систему линеаризованных уравнений (Ax = b), где A - это матрица (обычно размером менее 100x100), а x и b - векторы.Я использую прямой метод, то есть сначала инвертирую A, а затем нахожу решение по x = A ^ (- 1) b.Этот шаг повторяется в итеративном процессе до сходимости.

То, как я делаю это сейчас, используя матричную библиотеку (MTL4):
Для каждой итерации я копирую все коэффициентыиз A (значения) в объекте матрицы, затем инвертировать.Это самый простой и безопасный вариант.

Использование вместо него массива указателей:
В моем конкретном случае коэффициенты A обновляются между каждой итерацией.Эти коэффициенты хранятся в разных переменных (некоторые являются массивами, некоторые нет).Был бы потенциал для увеличения производительности, если бы я установил A в виде массива, содержащего указатели на эти переменные коэффициента, а затем инвертировал бы A на месте?

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

Таким образом, вопрос производительности сводится к следующему, как я вижу:
- Процесс инверсии матрицы занимает примерно столько же временипри условии, что разыменование указателей является недорогим.
- Массив указателей не требует дополнительной памяти для матрицы, содержащей значения.
- Опция массива указателей не должна копировать все значения NxNA между каждой итерацией.
- Значения, которые указывают на опцию массива указателей, обычно НЕ упорядочиваются в памяти.Надеемся, что все значения лежат в памяти относительно близко, но * A [0] [1] обычно не рядом с * A [0] [0] и т. Д.

Есть какие-либо комментарии к этому?Будет ли последнее замечание отрицательно влиять на производительность, таким образом взвешивая положительный эффект производительности?

Ответы [ 3 ]

2 голосов
/ 11 января 2011

Тест, тест, тест.

Особенно в области численной линейной алгебры.В игре много эффектов, поэтому существует целый ряд оптимизированных библиотек, которые решили эту проблему для вас.

Некоторые эффекты, которые следует учитывать:

  • Локальная память и эффекты кэша
  • Многопоточные эффекты (некоторые алгоритмы, которые оптимальны при работе с одним ядром, вызывают столкновение памяти / вытеснение кеша при использовании более одного ядра).

Заменить на тестирование нельзя.

1 голос
/ 11 января 2011

Вот некоторые комментарии:

  • Способна ли функция, которую вы используете для инверсии, обрабатывать матрицу указателей вместо значений?Если он не осознает, что должен выполнять косвенное действие, могут произойти все виды странных эффектов.
  • При выполнении инверсии матрицы на месте (то есть инвертированная матрица перезаписывает входную матрицу), все входные коэффициенты будут перезаписаны новыми значениями, потому что инвертирование матрицы не может быть выполнено путем переупорядочения элементов матрицы.
  • Во время процесса инверсии ни один из входных коэффициентов не может быть изменен извнепроцесс.Все такие обновления должны выполняться между итерациями.

Итак, вы получаете следующий набор компромиссов при выборе решения указателя:

  • Коэффициенты, составляющиематрица А больше не может быть рассчитана асинхронно с инверсией матрицы.
  • Либо все коэффициенты должны пересчитываться для каждой итерации (когда вы используете инверсию на месте, то есть инвертированная матрица использует то же самоепамяти в качестве входной матрицы), или вам все равно придется использовать матрицу из N x N значений для хранения результата инверсии.
0 голосов
/ 11 января 2011

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

Вы думаете о производительности априори.Это разумно, но реальная отдача a-posteriori.Другими словами, вы не знаете наверняка, где реальные возможности оптимизации, пока вам не скажет работающий код.

Вы не знаете, сколько времени будет потрачено на инверсию матрицы, умножениекопирование матрицы, разыменование или что.Люди могут догадаться.Если бы мне пришлось угадывать, это будет инверсия матрицы, потому что это 100x100.Однако, кое-что еще, что я не могу предположить, могло бы быть еще большим.У угадывания очень плохой послужной список, особенно когда вы можете просто узнать .

Вот пример того, что я имею в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...