У меня есть параллельная программа на C ++, которая выполняет оптимизацию методом перебора. По какой-то причине я получаю убывающую отдачу на ядро до ~ 6 ядер, после чего я врезаюсь в стену, где дальнейшие ядра не увеличивают скорость. Это согласуется при работе на 8 или 16-ядерном компьютере.
Когда я запускаю strace -f ./progname
, я получаю целую тонну следующего, что происходит именно в многопоточном разделе программы: [pid 2646] mprotect(0x7ffe7c030000, 4096, PROT_READ|PROT_WRITE) = 0
и некоторые из них происходят один за другим: [pid 2645] mprotect(0x7ffe78030000, 4096, PROT_READ|PROT_WRITE <unfinished ...>
- [pid 2646] <... mprotect resumed> ) = 0
Их не всегда из одного и того же pid
, хотя.
Когда я уменьшаю количество ядер, я получаю меньше вышеприведенных сообщений, а при 2 или 3 ядрах я не получаю.
Единственное, что я могу догадаться, - это то, что, возможно, это связано с огромным количеством распределений векторов и доступом, которые выполняются в каждом потоке. Я не использую другие библиотеки управления памятью, если это актуально.