Быстрый вопрос. для реализации MPI моего кода я получаю огромную разницу в обоих. Я знаю, что MPI_Wtime - это время, прошедшее каждым процессором, и clock() дает приблизительное представление о ожидаемом времени. Кто-нибудь хочет добавить какое-то утверждение?Разница между часами() и MPI_Wtime()
ответ
Функция clock
совершенно бесполезна. Он измеряет время центрального процессора, а не в режиме реального времени/время стены, и кроме того, он имеет следующие серьезные проблемы:
В большинстве реализаций, разрешение очень плохое, например, 1/100 секунды.
CLOCKS_PER_SECOND
- это не разрешение, просто шкала.С типовыми значениями
CLOCKS_PER_SECOND
(стандарты Unix требуют, например, 1 миллион),clock
будет переполняться в считанные минуты на 32-битных системах. После переполнения он возвращает -1.Большинство исторических реализаций фактически не возвращают -1 при переполнении, как требует стандарт C, но вместо этого обертывают. Поскольку
clock_t
обычно является подписанным типом, попытка выполнить арифметику с обернутыми значениями приведет либо к бессмысленным результатам, либо к неопределенному поведению.В Windows это делает совершенно неправильную вещь и меры, прошедшие реальное время, а не время процессора.
Официальное определение clock
заключается в том, что оно дает вам процессорное время. В Windows, для
истерических
исторических причин - это сломает некоторые приложения, если вы измените его, чтобы отразить время CPU сейчас - в Windows время просто истекло.
MPI_Wtime
дает, как вы говорите, «текущее время на этом процессоре», что совсем другое. Если вы сделаете то, что спит в течение 1 минуты, MPI_Wtime
переместится на 60 секунд вперед, где clock
(за исключением Windows) будет практически не изменяться.
Спасибо за ответ. Мне нужно измерить общее время программы MPI (конечно, это будет отличаться от каждого MPI_Wtime()). Профилирование мне не кажется хорошим, поскольку он не занимает много времени и обнаруживает некоторые другие функции, вытекающие из реализации MPI. Любая идея, как я могу это сделать? –
Я думаю, что в последний раз я могу позвонить в MPI_Barrier (MPI_COMM_WORLD), и после этого я могу отметить любой из MPI_Wtime() как общее время выполнения (это будет работать как шаг определения скорости) или буквально будет максимальным из всех MPI_Wtime(). Пожалуйста, подтвердите меня! –
Я не знаком с MPI, но быстрая проверка документации показывает, что 'MPI_Wtime' возвращает в реальном времени, а не время процессора. Фраза «на вызывающем процессоре» довольно вводит в заблуждение; это, похоже, не имеет никакого отношения к времени процессора, а скорее позволяет предположить, что разные ядра могут иметь несколько разные представления о том, что такое текущее время. Однако это несоответствие не должно существовать в системах высокого качества. –