Для очень коротких рабочих нагрузок может произойти значительное замедление из-за накладных расходов на создание потоков. Я не верю, что для 2 ^ 20 элементов в массиве такое огромное падение производительности.
Другим существенным источником снижения производительности является неспособность компилятора оптимизировать (в частности, векторизовать) код после того, как он был TBBfied. Узнайте, может ли ваш компилятор создать отчет о векторизации, и найдите различия между серийной и TBB-версиями.
Возможным источником замедления может быть конструктор копирования класса тела parallel_for, потому что тела копируются очень часто. Но данный код не выглядит подозрительным в этом отношении: кажется, тело содержит несколько указателей. В любом случае, посмотрите, может ли это быть проблемой.
Другим обычным источником значительных накладных расходов является слишком мелкий параллелизм, то есть множество задач, каждая из которых содержит очень мало работы. Но и здесь это не так, потому что размер зерна SIZE / 4 в 3-м параметре для block_range указывает, что оператор body () () будет вызываться не более 4 раз в соответствии с алгоритмом.
Я бы порекомендовал не указывать simple_partitioner и grainsize для первоначальных экспериментов, а вместо этого позволить TBB динамически распределять работу. При необходимости вы можете настроить его позже.