производительность — минимизировать ветвление в инкременте, если значение не равно нулю

У меня есть следующий вложенный цикл for:

for(k = 0; k < n; ++k) {
for(m = 0; m < n; ++m) {
/* other logic altering a */
if(a[index] != 0) count++;
}
}

где a содержит uint32_t, поскольку n может быть довольно большим (но постоянным), и это единственная ветвь (помимо сравнения k а также m с n), Я хотел бы оптимизировать это далеко.

Распределение ноль и ненулевое в a можно считать равномерно случайным.

Мой первый подход был

count += a[index] & 1;

но потом count будет увеличиваться только для всех нечетных чисел.

Кроме того: у меня также есть случай, когда a содержит boolно согласно C ++ Условные true а также false определяются как ненулевые и нулевые, которые в основном эквивалентны вышеупомянутой проблеме.

0

Решение

Как указано в комментариях к вопросу if(a[index] != 0) count++; не создает ветку (в данном случае), что было несколько проверено в сборке.

Для полноты эквивалента упомянутому утверждению count += a[index] != 0; (согласно стандарту § 4.7 [conv.integral])

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector