Я работаю над параллельным матрично-матричным множителем в 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
Первый, man 3 clock
говорит, что «функция clock () возвращает приблизительное время процессора, используемое программой». Поэтому для определения времени вам не нужно вычислять разницу. Это заблуждение является источником ошибки. Вам просто нужно позвонить после интенсивных вычислений и пренебречь временем, затрачиваемым setup stuff
,
Если вы не хотите принимать во внимание время установки, тогда вам действительно нужна разница. Так что просто используйте простой и надежный MPI_Wtime функция, которая получает точное количество секунд с определенного момента в прошлом.
Значение, которое вы получаете путем вычитания минимального начального времени из максимального конечного времени, не является общим временем ЦП в общепринятых терминах (т.е. в терминах time
полезность). Это время real
время. Чтобы получить действительно процессорное время, вы должны суммировать все времена обработки, т.е. MPI_Reduce
с разницей во времени и MPI_SUM
операция.
Других решений пока нет …