Расчет ЦП при использовании MPI

Я работаю над параллельным матрично-матричным множителем в MPI. У меня есть рабочая часть расчета, но я также хочу вычислить время процессора. Я застреваю, потому что похоже, что некоторые процессы сообщают время начала и окончания 0 и для задачи, которая должна занимать менее секунды (маленькие матрицы), программа сообщает 1000+ секунд времени ЦП (хотя я знаю, что он работает через секунду от наблюдения). Вот что я сейчас делаю:

#include <time.h>
#include "mpi.h"// other includes
int main()
{
int start, end, min_start, min_end;
if (rank == 0)
{
// setup stuff

start = clock();
MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

// master computation stuff

end = clock();
MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);

cout << "CPU time was "<< (double)(max_end - min_start) / CLOCKS_PER_SEC
<< " seconds" << endl;
}
else if (rank != 0)
{
// setup stuff

start = clock();
MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

// slave computation stuff

end = clock();
MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
}
}

Я не уверен, что источник ошибки. Когда я добавил в этот вывод отладки (после if (rank == 0) а также else if (rank != 0) заявление)

MPI_Barrier(MPI_COMM_WORLD);
for (int i=0; i<size; i++)
{
if (rank == i)
cout << "(" << i << ") CPU time = "<< end << " - " << start
<< " = " << end - start << endl;
MPI_Barrier(MPI_COMM_WORLD);
}

Я получаю следующий вывод

CPU time was 1627.91 seconds
(1) CPU time = 0 - 0 = 0
(2) CPU time = 0 - 0 = 0
(0) CPU time = 1627938704 - 32637 = 1627906067
(3) CPU time = 10000 - 0 = 10000

0

Решение

Первый, man 3 clock говорит, что «функция clock () возвращает приблизительное время процессора, используемое программой». Поэтому для определения времени вам не нужно вычислять разницу. Это заблуждение является источником ошибки. Вам просто нужно позвонить после интенсивных вычислений и пренебречь временем, затрачиваемым setup stuff,

Если вы не хотите принимать во внимание время установки, тогда вам действительно нужна разница. Так что просто используйте простой и надежный MPI_Wtime функция, которая получает точное количество секунд с определенного момента в прошлом.

Значение, которое вы получаете путем вычитания минимального начального времени из максимального конечного времени, не является общим временем ЦП в общепринятых терминах (т.е. в терминах time полезность). Это время real время. Чтобы получить действительно процессорное время, вы должны суммировать все времена обработки, т.е. MPI_Reduce с разницей во времени и MPI_SUM операция.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]