C ++ Linux Многопоточное узкое место. strace -f: `[pid 2646] mprotect (0x7ffe7c030000, 4096, PROT_READ | PROT_WRITE) = 0` - PullRequest
1 голос
/ 25 ноября 2011

У меня есть параллельная программа на 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 ядрах я не получаю.

Единственное, что я могу догадаться, - это то, что, возможно, это связано с огромным количеством распределений векторов и доступом, которые выполняются в каждом потоке. Я не использую другие библиотеки управления памятью, если это актуально.

1 Ответ

3 голосов
/ 25 ноября 2011

У меня есть параллельная программа на C ++, которая выполняет оптимизацию методом перебора.По какой-то причине я получаю убывающую отдачу на ядро ​​до ~ 6 ядер, после чего я врезаюсь в стену, где дальнейшие ядра не увеличивают скорость.Это согласуется при работе на 8 или 16-ядерном компьютере.

Можете ли вы описать алгоритм?Многие алгоритмы вычислений связаны с памятью.

Попробуйте профилировать ваше приложение с помощью oprofile, perf или, если это невозможно, gprof.

Я могу догадаться, что, возможно, это связано с огромным количеством векторных распределений и обращений, которые выполняются в каждом потоке.Я не использую никаких других библиотек управления памятью, если это уместно.

Очень простой способ снизить нагрузку на TLB - это использовать огромные страницы (предположительно, ваше оборудование поддерживает это).В Linux вы можете использовать libhugetlbfs и его morecore hook.

HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so  ./brute_force_optimization
...