Автоматизация профилирования программы на C с помощью GPROF

Я профилирую программу умножения матриц на C с помощью gprof. Эта программа на C имеет такую ​​общую структуру;

int main()

{

int n;

printf("enter size of square matrices");
scanf("%d", &n);

data(matM); //fill matrices with n x n random data 
data(matN); 

// this is unoptimized algo
matUnopt(int *matM, int *matN, int *MatOut, int size);


// this is optimized algo
matOpt(int *matM, int *matN, int *MatOut, int size);

 return(0);

}   

В настоящее время я занимаюсь профилированием:

Я запускаю исполняемый файл, задаю размер 100, а затем
$ gprof mat gmon.out > analysis1.txt

это генерирует analysis1.txt, откуда я вручную отмечаю время для matOpt(); и matUnopt();

Потом снова запускаю исполняемый мат, даю n=150, а потом

$  gprof mat gmon.out > analysis2.txt  

это генерирует analysis2.txt, откуда я вручную отмечаю время для matOpt(); и matUnopt();

и так далее.

Это очень трудоемкий и утомительный способ. Я хочу автоматизировать эту процедуру. Примерно так:

int main()

{

int n;


for (n=50; n<50000; n++)

{      
  data(matM); //fill matrices with n x n random data 
  data(matN); 

// this is unoptimized algo
matUnopt(int *matM, int *matN, int *MatOut, int size);


 //gprof records the time of completion of matUnopt for the particular value of n, and 
 puts in a file 

 // this is optimized algo
 matOpt(int *matM, int *matN, int *MatOut, int size);


 //gprof records the time of completion of matOpt for the particular value of n, and   
puts in a file 


  }

  return(0);

  }   

После выхода из приложения я ожидаю, что файл будет иметь такую ​​таблицу:

run# (x 50)   profiling result (as usual we get from gprof)               

1             matUnopt  time .....
              matOpt    time .....  

2             matUnopt  time .....
              matOpt    time .....  

3             matUnopt  time .....
              matOpt    time .....  

4             matUnopt  time .....
              matOpt    time .....  


and so on.

Обратите внимание, что вышеупомянутый «результат профилирования» - это то, что мы обычно получаем от gprof. Важно то, что у меня есть автоматизированный способ получения времени для функций для нескольких запусков исполняемого файла, тоже с разным размером ввода.

Это объяснение является приблизительным. Я был бы счастлив получить что-нибудь похожее на это. Например, приложение может выйти, а затем перезапустить собственное, чтобы получить новый результат профилирования. Это то, что я на самом деле делаю. Но я хочу делать это автоматически.

Как мне достичь этой цели?


person user2799508    schedule 06.01.2014    source источник


Ответы (1)


Можете ли вы использовать язык сценариев и указать свой размер в качестве аргумента для бинарного файла профилирования?

Например, с использованием аргументов в c: передача аргументов в main.

Этот сценарий bash автоматически запускает вашу программу с размером матрицы от 50 до 50000. Команда tee гарантирует, что вывод будет распечатан и сохранен в соответствующем файле: analysisxxx.txt

#!/bin/bash

for i in {50..50000}
do
    gprof mat gmon.out $i | tee analysis${i}.txt
done

Надеюсь, это вам немного поможет.

person Peter DW    schedule 06.01.2014
comment
Это кажется очень полезным. Таким образом, однако, я получу много-много файлов analysisxx.txt, и мне придется вручную открывать каждый из них, а затем смотреть на время для функций. Можем ли мы получить все результаты из всех файлов в одном файле? чтобы я мог легко сравнивать результаты для каждого размера? - person user2799508; 06.01.2014
comment
grof mat gmon.out $ i ›› inasinglefile.txt, используйте ›› вместо › - person Peter DW; 06.01.2014