Ускорить вызов функции внутри цикла

0
loop over a very long container (millions elements)
{
   each element compute 8 integers:  k1,k2,k3,...,k8

   call function    func(k1,k2,k3,...,k8)
}

container is a std::vector, element is a long integer
each k can only take {0,1,2,..5} six values.
func is a simple expression of complex number calculation, 
  involves std::conj and std::exp

Чтобы ускорить работу, я кэширую все возможные результаты функции func в массив и вместо этого вызываю func_array [k1] [k2] [k3].... Но если просто определить func_array как:     std:: complex func_array [6] [6] [6]..., программа умирает при переполнении стека.

Какие-нибудь лучшие решения для ускорения?

  • 7
    Выделить свой массив в кучу?
  • 2
    На этом уровне нам нужна дополнительная информация о вашей структуре данных: что такое контейнер, какие элементы, какие вычисления вы делаете, чтобы получить k… Непрерывная память может сильно помочь, так как компилятор будет векторизовать ее
Показать ещё 6 комментариев
Теги:
performance

2 ответа

0

Если функция func() всегда возвращает одно и то же значение для заданного набора входов (например, не зависит от времени, зависит от последовательности и т.д.), вы можете сделать следующее:

1. Всякий раз, когда вы вызываете func(), сохраните результат в кеш [используя значения k1... через k8 в качестве ключа к записи кэша]

2. Перед вызовом функции func() проверьте, есть ли у вас значение кэшированного значения

Кэш сам по себе может быть Картой, где вы строите ключ, объединяя k1... thru... k8 в некотором роде, который подходит для их типа данных.

  • 1
    Это то, что делает ОП.
  • 0
    Разве многомерный массив C ++ не ведет себя почти как хэш-карта с точки зрения производительности чтения? Единственное преимущество, которое я мог видеть в динамическом хеше, было бы, если бы входные значения выходили за пределы ожидаемого диапазона 0-5.
Показать ещё 3 комментария
0

Вы создаете массив std::complex[6][6]...[6] на стек? Во-первых, это может привести к переполнению стека: это довольно большой массив для множества стеков. И второе: если вы создаете он в стеке, он будет повторно инициализироваться каждый раз, когда вы вызываете функция. Вероятно, вам нужен локальный статический массив, который будет инициализирован один раз (первый раз, когда он встречается), и затем сохраните его значение между вызовами функций.

  • 0
    Я кеширую его в переменной-члене, цикл находится внутри функции-члена.
  • 0
    static std::complex func_array[6][6][6][6][6][6][6][6] = {0}; тогда внутри метода класса?
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню