2016-04-06 6 views
0

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

#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

Прежде всего, я бы не использовал 'clock()' вообще. Вы можете использовать 'chrono' с C++ 11 или его реализацию Boost с pre C++ 11. –

ответ

0

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

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

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

+0

Поскольку 'MPI_Wtime' дает время на стене, а не время процессора, тогда, если в кластере также выполняются другие задания, тогда время будет увеличено, не так ли? Моя цель - вычислить ускорение от последовательного выполнения до параллельного выполнения. – RagingRoosevelt

+2

@RagingRoosevelt Ускорение от серийного исполнения должно быть рассчитано как время стены на 1 машине по сравнению с временем стены на машинах N. Время процессора не учитывает этот расчет – NoseKnowsAll

+0

В дополнение к тому, что сказал @NoseKnowsAll, измерение времени процессора бесполезно. Большинство реализаций MPI порождают дополнительные потоки для обработки сетевых запросов, и если какой-либо из них вращается при опросе данных, общее время процессора, о котором сообщает 'clock()', будет обладать небесной ракетой. Кроме того, 'clock()' очень не переносится, например. он возвращает реальное время в Windows. –

Смежные вопросы