Я использую Ubuntu на компьютере с 32 процессорами (1 сокет, 16 ядер на сокет, 2 потока на ядро).
Поток не является процессором. Ядро даже не процессор;Каждое ядро может выполнять код независимо, но все они совместно используют одну шину памяти и различные другие ресурсы.
Итак, у вас есть 32 потока, работающих на 16 ядрах, и все они используют одну шину. В какой-то момент будет конкуренция за то, и это означает, что многие из этих нитей должны сидеть и ждать. Больше потоков -> больше конфликтов -> больше ожиданий.
Теперь мы все можем сделать обоснованные предположения о том, где может быть конфликт ресурсов - это файловая система, шина памяти или что-то еще? Но мы мало знаем о вашей системе и о том, что еще может происходить, так что это, вероятно, бессмысленно. Профилирование вашего кода, работающего на большем количестве потоков, чтобы увидеть, где он ждет, может предложить некоторые ответы. Просто имейте в виду, что эти ответы могут быть специфическими для вашей текущей ситуации;если вы измените вычислительную работу, которую необходимо выполнить для каждого объекта, или измените способ сбора выходных данных и т. д., это, вероятно, повлияет на то, где находится «сладкое пятно».