Производительность снижается при применении TBB parallel_for к 40-ядерной рабочей станции
Я реализовал TBB parallel_for таким образом на 4-ядерном (8 потоков) ноутбуке i7-3920XM. На выполнение вычислений уходит около 15 секунд, а загрузка процессора составляет около 70% для каждого ядра. Если я инициализирую для работы фиксированное число потоков, например g_nthreads = 4, это займет 12 секунд. Это нормально, и я доволен способом по умолчанию.
// g_nthreads = 8, on 4-core(8 threads) laptop
int g_nthreads = tbb::task_scheduler_init::default_num_threads();
tbb::task_scheduler_init tbb_init(g_nthreads);
...
// k iterates from 0 to N-1
tbb::parallel_for(0, N, [tool, pos, rock,...] (int k) {
...
Func( tool, pos, k, rock ,...);
}
)
Проблема заключается в том, что если я использую тот же код на 20-ядерной (40 потоков) рабочей станции Xeon E5-2680, производительность быстро снижается до 30 с, в результате чего TBB автоматически инициализирует 40 потоков для работы. Общее использование процессора в этом случае составляет 12%, и только половина из них показана работающей. Когда я снова фиксирую количество потоков в 4, это занимает 13 секунд, но общее использование процессора все еще составляет ~12%.
Похоже, что для работы не обязательно нужно столько потоков для запуска на 20-ядерном (40 потоков) компьютере, а накладные расходы на разделение работы на 40 задач доминируют в производительности.
Как максимально использовать процессор и повысить производительность на 20-ядерном (40-потоковом) компьютере для этой работы? Func () - это функция EM, требующая большого количества вычислений.
Обновлено:
Наконец я достигаю производительности до 100% CPU на 40-ядерном компьютере.
1, программа фиксирует потоки на ядрах, которые обычно не должны быть правильными. Лучше позволить TBB самому принять решение о переключении ядер.
2. Заставьте программу использовать tbbmalloc.dll и tbbmalloc_proxy.dll, которые можно установить в VS: свойство проекта -C/C++ - Дополнительно - Принудительный включение файла -> "tbb/tbbmalloc_proxy.h". Эти 2 DLL предназначены для управления памятью TBB.