У меня есть цикл, который занимает примерно от 90% до 99% времени программы.Он читает огромную LUT, и этот цикл выполняется> 100 000 раз, поэтому он заслуживает некоторой оптимизации.
EDIT:
LUT (на самом деле существуют различные массивы, которыесоставьте LUT) из массивов ptrdiff_t
и unsigned __int128
.Они должны быть такими широкими из-за алгоритма (особенно 128-битных).T_RDY
является единственным bool
массивом.
РЕДАКТИРОВАТЬ:
LUT хранит прошлые комбинации, используемые для решения проблемы, которая не работала.Между ними нет никакой связи (которую я пока вижу), поэтому я не вижу более подходящего шаблона поиска.
Однопоточная версия цикла:
k = false;
for (ptrdiff_t i = 0; i < T_IND; i++) {
if (T_RDY[i] && !(~T_RWS[i] & M_RWS) && ((T_NUM[i] + P_LVL) <= P_LEN)) {
k = true;
break;
}
}
СЭтот код, который использует OpenMP, я сократил время между 2x и 3x в 4-ядерном процессоре:
k = false;
#pragma omp parallel for shared(k)
for (ptrdiff_t i = 0; i < T_IND; i++) {
if (k)
continue;
if (T_RDY[i] && !(~T_RWS[i] & M_RWS) && ((T_NUM[i] + P_LVL) <= P_LEN))
k = true;
}
EDIT:
Информация о данныхиспользуется:
#define DIM_MAX 128
#define P_LEN prb_lvl[0]
#define P_LVL prb_lvl[1]
#define M_RWS prb_mtx_rws[prb_lvl[1]]
#define T_RWS prb_tab
#define T_NUM prb_tab_num
#define T_RDY prb_tab_rdy
#define T_IND prb_tab_ind
extern ptrdiff_t prb_lvl [2];
extern uint128_t prb_mtx_rws [DIM_MAX];
extern uint128_t prb_tab [10000000];
extern ptrdiff_t prb_tab_num [10000000];
extern bool prb_tab_rdy [10000000];
extern ptrdiff_t prb_tab_ind;
Однако тот факт, что я не получаю улучшения прибл.4x означает, что вводит накладные расходы, которые, я думаю, увеличиваются от 2x до 1,5xЧасть издержек неизбежна (создание и уничтожение потоков), но есть некоторые новые издержки из-за того факта, что OpenMP не позволяет break
из параллельного цикла, и что я добавил if
к каждой итерации, иЯ хотел бы избавиться от него, если это возможно.
Могу ли я применить какую-либо другую оптимизацию?Может быть, вместо этого использовать pthreads.
Стоит ли редактировать какую-то сборку?
Я использую GCC 9 с -O3 -flto (среди прочих).
EDIT:
Процессор: i7-5775C
Но я планирую использовать другие процессоры x64 с большим количеством ядер.