Создание статической (но сложной) таблицы поиска с использованием шаблонов - PullRequest
1 голос
/ 15 января 2011

Я сейчас нахожусь в процессе оптимизации кода числового анализа. В коде есть таблица поиска элементов 200x150 (в настоящее время статическая std::vector <std::vector<double>>), которая создается в начале каждого запуска. Построение справочной таблицы на самом деле довольно сложное - значения в справочной таблице построены с использованием итеративного метода секущих на сложном наборе уравнений. В настоящее время для моделирования построение справочной таблицы составляет 20% времени выполнения (время выполнения составляет порядка 25 секунд, построение справочной таблицы занимает 5 секунд). Хотя 5 секунд может показаться не слишком много, при запуске наших симуляций MC, когда мы запускаем симуляции 50k +, это внезапно становится большим отрезком времени.

Наряду с некоторыми другими идеями, одна вещь, которая была высказана - можем ли мы построить эту таблицу поиска, используя шаблоны во время компиляции? Сам стол никогда не меняется. Жесткое кодирование большого массива не является обслуживаемым решением (уравнения, которые входят в составление таблицы, постоянно изменяются), но кажется, что если таблица может быть сгенерирована во время компиляции, это даст нам лучшее из обоих миров (легко обслуживаемый, без накладных расходов во время выполнения).

Итак, я предлагаю следующий (значительно упрощенный) сценарий. Допустим, вы хотели сгенерировать статический массив (используйте тот контейнер, который вам больше подходит - массив 2D c, вектор векторов и т. Д.) Во время компиляции. У вас есть определенная функция -

double  f(int row, int col);

, где возвращаемое значение - это запись в таблице, строка - это строка таблицы поиска, а col - столбец таблицы поиска. Можно ли создать этот статический массив во время компиляции, используя шаблоны, и как?

Ответы [ 5 ]

4 голосов
/ 15 января 2011

Обычно лучшим решением является генерация кода. Там у вас есть вся свобода, и вы можете быть уверены, что результат на самом деле double[][].

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

Несколько вещей здесь.

  1. То, что вы хотите сделать, почти наверняка хотя бы частично возможно.

  2. Значения с плавающей точкой являются недопустимыми аргументами шаблона (просто не спрашивайте, почему). Хотя вы можете представлять рациональные числа в шаблонах, используя представление N1 / N2, количество математических вычислений, которое вы можете сделать для них, не охватывает весь набор, который можно выполнить для рациональных чисел. Например, root (n) недоступен (см. root (2)). Если вы не хотите создавать экземпляры статических двойных переменных в байжиллионе, вы захотите, чтобы ваш аксессор value был функцией. (может быть, вы можете придумать новое шаблонное представление с плавающей точкой, которое разделяет exp и mant, и тогда вы так же хороши, как и с двойным типом ... получайте удовольствие: P)

  3. Код метапрограммирования трудно отформатировать четким способом. Кроме того, по самой своей природе это довольно сложно читать. Даже эксперту будет непросто проанализировать фрагмент кода TMP, который он не написал, даже если он довольно прост.

  4. Если стажер или кто-либо из старших сотрудников даже ДУМАЕТ о том, что просто смотрит на код TMP, их голова взрывается. Хотя иногда старшие разработчики взрываются громче, потому что они сходят с ума от новых вещей (заставляя вашего босса чувствовать себя некомпетентным, это может иметь серьезные последствия, даже если это не так).

Все это говорит ... шаблоны - полный по Тьюрингу язык. Вы можете делать с ними «что угодно» ... и под всем, что мы имеем в виду, мы подразумеваем все, что не требует каких-то внешних способностей, таких как доступ к системе (потому что вы просто не можете заставить компилятор создавать новые потоки, например). Вы можете построить свой стол. Тогда вам нужно ответить на вопрос, действительно ли вы хотите.

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

Сохраните таблицу на диске при первом запуске программы и восстановите ее, только если она отсутствует, в противном случае загрузите ее из кэша.

Включите строку версии в файл, чтобы она обновлялась при изменении кода.

0 голосов
/ 15 января 2011

Если бы на вашем столе была куча целых, тогда да, вы могли бы.Может быть.Но то, что вы, конечно, не могли сделать, это генерировать двойные значения во время компиляции.

Более важно, я думаю, что простое двойное число [] [] будет лучше, чем вектор векторов - вы продвигаете МНОГО динамического выделения для таблицы статического размера.

0 голосов
/ 15 января 2011

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

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