Компиляторы Фортрана раньше имели оптимизацию на уровне или лучше, чем компиляторы Си.
Поэтому я не ожидал бы выигрыша, просто переключая язык, и скорее сосредоточился бы на улучшении алгоритмов.
Как насчет замены расчета преобразования индекса на справочную таблицу?
Есть ли у вас память для хранения значений ixsym
для заданных индексов i
и j
?
Да, он компенсирует вашу память для компромисса процессора, но если у вас много матриц, эта дополнительная может помочь.
Действительно ли необходимо постоянно вычислять преобразование? Например. если вы перебираете элементы: ixsym(i, j+1) = ixsym(i, j) + 1
, если i < j
.
Другая идея, хотя и зависит от оборудования, может заключаться в том, чтобы упорядочить данные по-другому, чтобы они оставались в пределах областей кэша ЦП. ( Link )
О вашем преобразовании индекса:
Сначала я думал, что вы использовали какой-то вариант функции связывания Кантора для перечисления вашего симметричного двумерного массива. Я попросил мою подругу Руби построить несколько пар, и она сказала мне:
(0, 0) -> 0 (0, 1) -> 0 (0, 2) -> 1 (0, 3) -> 3 (0, 4) -> 6
(1, 0) -> 0 (1, 1) -> 1 (1, 2) -> 2 (1, 3) -> 4 (1, 4) -> 7
(2, 0) -> 1 (2, 1) -> 2 (2, 2) -> 3 (2, 3) -> 5 (2, 4) -> 8
(3, 0) -> 3 (3, 1) -> 4 (3, 2) -> 5 (3, 3) -> 6 (3, 4) -> 9
(4, 0) -> 6 (4, 1) -> 7 (4, 2) -> 8 (4, 3) -> 9 (4, 4) -> 10
Я бы ожидал только два вхождения рассчитанного индекса, но я вижу три для некоторых пар. Это предназначено?
Обновление:
Это было начало индекса, как отметил один из пользователей Жан-Клод Арбо в своем комментарии.
Вот ответ Руби с индексами, начинающимися с 1:
(1, 1) -> 1 (1, 2) -> 2 (1, 3) -> 4 (1, 4) -> 7 (1, 5) -> 11
(2, 1) -> 2 (2, 2) -> 3 (2, 3) -> 5 (2, 4) -> 8 (2, 5) -> 12
(3, 1) -> 4 (3, 2) -> 5 (3, 3) -> 6 (3, 4) -> 9 (3, 5) -> 13
(4, 1) -> 7 (4, 2) -> 8 (4, 3) -> 9 (4, 4) -> 10 (4, 5) -> 14
(5, 1) -> 11 (5, 2) -> 12 (5, 3) -> 13 (5, 4) -> 14 (5, 5) -> 15