Время, которое вы сообщаете, измеряется с помощью функции часов:
Функция clock()
возвращает приблизительное время процессора, используемое программой.
$ time bin/amit_kumar_threads.cpp
6.62seconds
serial: 2.7seconds
real 0m5.247s
user 0m9.025s
sys 0m0.304s
Реальное время будет меньше для многопроцессорных задач, но время процессора, как правило, будет больше.
Когда вы используете несколько потоков, работа может выполняться более чем одним процессором, но объем работы одинаков, и, кроме того, могут быть некоторые издержки, такие как конфликт за ограниченные ресурсы. clock()
измеряет общее время процессора, которое будет работать + любые конкурентные издержки. Таким образом, оно никогда не должно быть меньше времени процессора для выполнения работы в одном потоке.
Немного трудно определить из вопроса, знали ли вы это, и были удивлены, что значение, возвращаемое clock()
, было вдвое больше, чем для одного потока, а не немного больше, или вы ожидали, что оно будет меньше.
Использование clock_gettime()
вместо этого (вам понадобится библиотека реального времени librt, g++ -lrt
и т. Д.) Дает:
$ time bin/amit_kumar_threads.cpp
2.524 seconds
serial: 2.761 seconds
real 0m5.326s
user 0m9.057s
sys 0m0.344s
, который по-прежнему меньше ускорения, чем можно было бы надеяться, но, по крайней мере, числа имеют некоторый смысл.
100000000 * 20 / 2.5s = 800 Гц, частота шины 1600 МГц, поэтому я подозреваю, что при чтении и записи для каждой итерации (при условии некоторого кэширования) пропускная способность памяти ограничена, как предполагает tstenner, и * Значение 1028 * показывает, что большую часть времени некоторые ваши процессоры ждут данных. (кто-нибудь знает, включает ли clock()
время такие киоски?)