Спасибо за многочисленные комментарии,
отвечаю на вопросы по порядку:
А почему там -= вместо +=?
просто матрица должна быть со знаком минус и это сделано чтобы не заводить новых циклов, вряд ли это как то влияет на производительность
А ** — это умножить на число по адресу?
совершенно верно
Можно попробовать ввести ещё несколько указателей для исключения умножения при взятии элементов матриц по индексам.
я пробовал это делать - но производительность не меняется, переменная ind введена по тем же соображениям - однако если её убрать и в скобках написать
- *(D+ii+j*NStr)-=*(A+ii+k*NStr)**(B+k+j*NStr);
производительность остаётся такой же, так что видимо это не самое узкое место
Возможно, функция Matlab написана на ассемблере, а это ещё быстрее
возможно это и так, можно будет потом попробовать и написать ассемблерную вставку, только даст ли это существенный выигрыш? если ускорение будет 1.5 - 2 раза, то лучше и не связываться
Посмотрите в википедии
это я всё смотрел, где то в сети написано, что в Matlab реализован эффективный алгоритм перемножения, но что за алгоритм конкретно - не сказано.
Цитата:
Скорее всего вы неправильно произвели оценку. Между 1000 в степени 3 и 1000 в степени 2,3727 значительная разница.
что я 0.1 секунду от 10 неправильно отличил? показатель степени как таковой меня интересует мало, хотя согласен с последующими комментариями 2,3727 - это вряд ли, так как это практически бесполезный алгоритм. Скорее всего там алгоритм Штрассена с логарифмом 2.8 и при этом маленькая константа, но это всё мои догадки ...
Возьмите BLAS
спасибо, попробую
А у меня получилось 8 сек. Без особых ухищрений
Это только подтверждает, что никаких особых ошибок у меня нет.
Замедление на пару сек. может быть из за изменения загрузки компьютера, у меня каждый раз получаются разные цифры, так что на отклонения менее 10-15% думаю ориентироваться не стоит. Прирост должен быть в разы, а в идеале - на порядки.
На моей машине ваш код отрабатывает за 6.5с, после перестановки циклов - за 0.22с.
спасибо, попробую, это уже кое что