Согласно приведенному ниже уравнению (из википедии ) самым быстрым способом было бы разделить диапазон i = 1, k на количество потоков, дать каждому потоку один сегмент диапазона, и каждый поток обновляет Конечный результат в замке. «Академическим способом» будет разделить диапазон на задачи, каждая задача состоит в том, чтобы вычислить (n - k + i) / i, а затем, независимо от того, сколько у вас потоков, все они запускаются в цикле, запрашивая следующую задачу. Первый быстрее, второй ... академический.
РЕДАКТИРОВАТЬ: дальнейшее объяснение - в обоих случаях у нас есть произвольное количество потоков. Обычно количество потоков равно количеству процессорных ядер, поскольку добавление большего количества потоков не дает никаких преимуществ. Разница между двумя способами заключается в том, что делают эти потоки.
В первом случае каждому потоку присваиваются N, K, I1 и I2, где I1 и I2 - сегмент в диапазоне 1..K. Затем каждый поток имеет все данные, в которых он нуждается, поэтому он вычисляет свою часть результата и по окончании обновляет окончательный результат.
Вторым способом каждому потоку дается N, K и доступ к некоторому синхронизированному счетчику, который считает от 1 до K. Затем каждый поток получает одно значение из этого общего счетчика, вычисляет одну долю результата, обновляет конечный результат, и повторяется до тех пор, пока счетчик не сообщит потоку, что больше нет элементов. Если случится так, что некоторые процессорные ядра будут быстрее, чем другие, тогда этот второй способ позволит максимально использовать все ядра. Недостатком второго способа является слишком большая синхронизация, которая эффективно блокирует, скажем, 20% потоков.