Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2011, 18:23   #1
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию Замер времени работы программы

Всем привет!
Я написал программу с использованием MPI (Message Passing Interface).
Мне нужно замерить время работы всей программы и отдельных ее частей. Для замера времени использовал функцию MPI_Wtime(). Программа выдавала не такие результаты, какие мне были нужны. Тогда я стал разбираться в чем же дело, писать различные тесты и т.д. И вот один из тестов показал мне странный результат: я замерил время работы ДВУХ операций сложения чисел типа double и время работы ЧЕТЫРЕХ операций сложения чисел типа double. В результате получилось, что время работы четырех сложений почти такое же как и для двух сложений. Если подумать, то время работы двух сложений должно быть почти в два раза меньше, чем четырех. Может я что-то не учитываю или неправильно понимаю. Очень нужна помощь, т.к. сроки поджимают! У кого есть какие либо предположения или может кто-то знает в чем дело - поделитесь знаниями пожалуйста. Код описанного теста ниже (он простой и его не так много, как кажется). Результат двух операций сложения выводится как "Oper Time 1", четырех операций - "Oper Time 2".

Код:
#include <mpi.h>
#include <iostream>
#include <stdio.h>
#include <windows.h>

using namespace std;


//-----------------------------------------------------------------------------------------

int main(int argc, char* argv[])
{
	double N = 100000000;
	double StartOper1, EndOper1, StartOper2, EndOper2;

	int namelen, numprocs, rank;
	char processor_name[MPI_MAX_PROCESSOR_NAME];

	MPI_Init(&argc,&argv);
	
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Get_processor_name(processor_name,&namelen);	

	cout<< "Process "<<rank<<" of "<<numprocs<<" is on "<<processor_name<<endl;	
	
	double Time1, Time2;
	double Time3, Time4;
	double TimeAVG = 0;
	double TimeAVG1 = 0;

//----------------------------------------------------------------------------------------
	double i;

	double x = 0;	
	double y = 0;
	double z = 0;

	StartOper1 = MPI_Wtime();
	for (i = 0; i<N; i++){
		Time3 = MPI_Wtime();
		x = 1;
		y = 4;	
		Time1 = MPI_Wtime();
		z = x + y;
		x = z + y;
		Time2 = MPI_Wtime();
		
		Time4 = MPI_Wtime();

		TimeAVG = TimeAVG + Time2 - Time1;
		TimeAVG1 = TimeAVG1 + Time4 - Time3;

	};
	EndOper1 = MPI_Wtime();

	cout<<endl;
	cout<< "All Time 1 = "<<(EndOper1 - StartOper1) <<endl;
	cout<< "Oper Time 1 = "<<TimeAVG <<endl;
	cout<< "Circle Time 1 = "<<TimeAVG1 <<endl;

//----------------------------------------------------------------------------------------

	StartOper2 = 0; 
	EndOper1 = 0;
	TimeAVG = 0;
	TimeAVG1 = 0;

	StartOper2 = MPI_Wtime();
	for (i = 0; i<N; i++){
		Time3 = MPI_Wtime();
		x = 5;
		y = 7;
		Time1 = MPI_Wtime();
		z = x + y;
		x = z + y;
		y = z + x;
		x = y + y;
		Time2 = MPI_Wtime();
		
		Time4 = MPI_Wtime();

		TimeAVG = TimeAVG + Time2 - Time1;
		TimeAVG1 = TimeAVG1 + Time4 - Time3;

	};
	EndOper2 = MPI_Wtime();

	cout<<endl;
	cout<< "All Time 2 = "<<(EndOper2 - StartOper2) <<endl;
	cout<< "Oper Time 2 = "<<TimeAVG <<endl;
	cout<< "Circle Time 2 = "<<TimeAVG1 <<endl;

	MPI_Finalize();
	
	return 0;
};
JuniorProger вне форума Ответить с цитированием
Старый 06.12.2011, 18:32   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

эти сложения выполняются за такое ничтожное время что там и мерять то нечего


можешь также попробывать убрать все оптимизации компилятора.
onewho вне форума Ответить с цитированием
Старый 06.12.2011, 18:37   #3
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Цитата:
эти сложения выполняются за такое ничтожное время что там и мерять то нечего
Но я ведь в цикле гоняю, поэтому за 100000000 шагов цикла должна накопиться приличная разница
Цитата:
можешь также попробывать убрать все оптимизации компилятора.
Пользуюсь Visual Studio. Там в свойствах проекта указано, что оптимизация выключена.
JuniorProger вне форума Ответить с цитированием
Старый 06.12.2011, 18:58   #4
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Но я ведь в цикле гоняю, поэтому за 100000000 шагов цикла должна накопиться приличная разница
ну ок, а точно ВСЕ оптимизации выключены?
onewho вне форума Ответить с цитированием
Старый 06.12.2011, 19:09   #5
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Ну я смотрел так: Проект -> Свойства -> С/С++ -> Оптимизация
Там в верхней строке написано, что отключено. Да и в других строках тоже самое. Я сам сначала думал на оптимизацию, стал в интернете искать как отключить. Нашел где посмотреть (описано в первой строке). Там посмотрел - оказалось что выключено. Пробовал писать #pragma optimize("", off) - результат не изменился
JuniorProger вне форума Ответить с цитированием
Старый 06.12.2011, 19:44   #6
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Что же, никто не знает совсем? Буду рад любым догадкам.
JuniorProger вне форума Ответить с цитированием
Старый 06.12.2011, 21:29   #7
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Нормальный способ измерять время это присваивание процессу максимального приоритета и измерять нужно не время как таковое, а количество тактов затраченных на вычисления. Для этого есть команда rdtsc, к слову вам вообще в раздел ассемблера, помнится Goodwin98 создавал тему(в разделе ассемблера), где выкладывал полигон для тестов, правда, он на ассемблере, но суть всех действий, думаю, будет вполне понятна.

Мне почему-то кажется, что даже если этот самый MPI делает тоже самое, он непременно накладывает определенные задержки, которые совсем не линейны. Хотя по правде говоря, смысл таких точных измерений есть только в случае с очень короткими отрезками кода.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 06.12.2011, 22:56   #8
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
Нормальный способ измерять время это присваивание процессу максимального приоритета и измерять нужно не время как таковое, а количество тактов затраченных на вычисления. Для этого есть команда rdtsc
Спасибо за ответ!
Я запускал этот тест на кластере. На узле, где он запускался, не было других процессов, поэтому думаю, что дело не в приоритете. Мне нужно измерить именно время, а не количество тиков, т.к. нужно учесть время пересылки между процессами (в моей программе несколько взаимодействующих между собой процессов). Вообще программа была написана для тестирования на кластере, но писал я ее дома и никаких проблем не было, пока не стал тестить на кластере.
JuniorProger вне форума Ответить с цитированием
Старый 15.02.2012, 17:14   #9
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Всем спасибо! Закрывайте.
JuniorProger вне форума Ответить с цитированием
Старый 16.02.2012, 08:58   #10
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

Если аппаратно поддерживается счетчик производительности, попробуй связку функций: QueryPerformanceCounter и QueryPerformanceFrequency

Код:
псевдо код:
QueryPerformanceCounter(Ctr1)

//код время выполнения, которого хотим измерить

QueryPerformanceCounter(Ctr2)

QueryPerformanceFrequency(Freq)

time = ( Ctr2 - Ctr1 ) / Freq
ElectroMent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Высокоточный замер времени KimboSlice C# (си шарп) 9 08.05.2011 09:58
Замер времени выполнения nickel-j Компоненты Delphi 3 28.05.2010 17:02
Профилирование (Измерение времени работы программы) megakatapuz Общие вопросы C/C++ 0 06.01.2010 23:04
Подсчет времени работы алгоритмов Solncelikiy Общие вопросы C/C++ 2 15.12.2009 20:15
Вычисление времени работы программы Monte-Kristo Паскаль, Turbo Pascal, PascalABC.NET 2 12.06.2009 13:25