Я занимаюсь квадратичным программированием и видел разные библиотеки. Я видел различные Eigen варианты QuadProg ++ (Форумы KDE, Бенджамин Стивенс, Сообщения StackOverflow). Просто в качестве теста я раздвоил собственный вариант Вингсита, доступен на GitHub, реализовать задачи размера компиляции для измерения производительности с помощью шаблонов.
Я обнаружил, что у меня хуже производительность в шаблоне, чем в случае динамического размера (MatrixXD / VectorXD) из кода wings. Я знаю, что это не простой вопрос, но кто-нибудь может увидеть причину, почему это может быть?
Примечание: мне нужно увеличить размер проблемы / количество итераций, я опубликую это, как только смогу.
РЕДАКТИРОВАТЬ: я использую GCC 4.6.3 на Ubuntu 12.04. Вот флаги, которые я использую (модифицировано из кода wings):
CFLAGS = -O4 -Wall -msse2 -fopenmp # option for obj
LFLAGS = -O4 -Wall -msse2 -fopenmp # option for exe (-lefence ...)
Преимущества кода статического размера, как правило, уменьшаются по мере увеличения размеров. Типичные преимущества кода статического размера в основном включают (но не ограничиваются) следующее:
Другими словами, для небольших размеров (до N = 12 или около того) статический код может быть намного лучше и быстрее, чем эквивалентный динамически изменяемый код, если компилятор довольно агрессивно относится к встраиванию и циклу разворачивания. Но когда размеры больше, нет смысла.
Кроме того, у статического размера есть ряд недостатков:
Итак, урок, который можно извлечь из этого, состоит в том, чтобы использовать векторы и матрицы статического размера только для небольших вещей, таких как 2-6-мерные векторы или матрицы. Но помимо этого, предпочтительнее использовать код динамического размера (или попробовать код статического размера, но убедиться, что он работает лучше, потому что это не гарантировано). Итак, я бы посоветовал вам пересмотреть свою идею использования кода со статическим размером для более крупных проблем.
Других решений пока нет …