Зачем использовать большее количество потоков, чтобы программа работала медленнее?
Создание и объединение потоков требует дополнительных затрат. Если потокам нечего делать, эти накладные расходы могут быть дороже, чем реальная работа.
Ваши потоки выполняют только простую сумму, которая не так уж и дорога. Также учтите, что переход, например, от 10 до 11 потоков, не сильно меняет рабочую нагрузку на поток.
10 потоков -> 10000000 сум на поток
11 потоков -> 9090909 сум на поток
Накладные расходы на создание дополнительного потока могут превышать «сохраненную рабочую нагрузку» на поток.
На моем P C программа выполняется менее чем за 100 миллисекунд. Многопоточность не стоит проблем.
Вам нужна более интенсивная задача, прежде чем многопоточность стоит делать.
Также обратите внимание, что редко имеет смысл создавать больше потоков, чем количество ядер (включая гиперпоток) на вашем компьютере.
ложное совместное использование
да, «ложное совместное использование» может повлиять на производительность многопоточной программы, но я сомневаюсь, что это настоящая проблема в вашем случае.
«ложное совместное использование» - это то, что происходит в (некоторых) системах кеширования, когда два потока (или, скорее, два ядра) записывают в две разные переменные, принадлежащие одной и той же строке кеша . В таких случаях два потока / ядра соревнуются за владение строкой кеша (для записи), и, следовательно, им придется обновлять sh память и кеш снова и снова. Это плохо для производительности.
Как я уже сказал - я сомневаюсь, что это ваша проблема. Умный компилятор сделает вашу l oop исключительно с использованием регистров ЦП и только в конце будет записывать в память. Вы можете проверить дизассемблирование вашего кода, чтобы убедиться, что это так. .