Mengumpulkan Profil Tepi LLVM dengan llvm-prof

Saya menggunakan perintah ini untuk mengkompilasi kode di bawah ini untuk mengumpulkan profil tepi/blok di trunk-llvm:

clang -emit-llvm -c sort.c -o sort.bc
opt -insert-edge-profiling sort.bc -o sort_prof.bc
clang sort_prof.bc -lprofile_rt -L/llvms/lib -o sort_prof

kemudian saya jalankan programnya dan menampilkan informasi profiling menggunakan llvm-prof sort_prof.bc, dan hasilnya adalah:

===-------------------------------------------------------------------------===
Function execution frequencies:

 ##   Frequency
  1. 4.3e+05/708539 main
  2. 2.8e+05/708539 quickSort

  NOTE: 2 functions were never executed!
.....

Pertanyaan saya adalah mengenai frekuensi eksekusi. Apakah masuk akal mengeksekusi main 4.3e+05 kali? Kenapa begitu? Kode yang saya kompilasi ada di bawah.

###################### sort.c ########################
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int MAX = 1000000;

void swap(int* a, int* b) {
  int tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
}

int partition(int vec[], int left, int right) {
  int i, j;

  i = left;
  for (j = left + 1; j <= right; ++j) {
    if (vec[j] < vec[left]) {
      ++i;
      swap(&vec[i], &vec[j]);
    }
  }
  swap(&vec[left], &vec[i]);

  return i;
}

void quickSort(int vec[], int left, int right) {
  int r;

  if (right > left) {
    r = partition(vec, left, right);
    quickSort(vec, left, r - 1);
    quickSort(vec, r + 1, right);
  }
}

int main(void) {

        int vet[MAX], i=0;

        srand(time(NULL));

        for (i=0; i<MAX; i++) {
                vet[i] = rand() % 654321;
        }

        quickSort(vet, 0, MAX-1);

        for (i=0; i<MAX; i++) {
                if ((rand() % 7) > 2) {
                        printf("Num$[%d] = %d\n", i, vet[i]);
                }
                else if ((rand() % 4) > 2) {
                        printf("Num@[%d] = %d\n", i, vet[i]);
                }
                else if ((rand() % 2) > 1) {
                        printf("Num#[%d] = %d\n", i, vet[i]);
                }
        }

        return 0;
}

person JohnTortugo    schedule 31.01.2013    source sumber


Jawaban (1)


Masalahnya adalah saya meneruskan ke llvm-prof file bitcode dengan instrumentasi, yang benar adalah menggunakan file asli (tanpa instrumentasi):

llvm-prof sort.bc

Masalah lain yang terkait dengan llvm-prof adalah pembulatan frekuensi eksekusi fungsi/blok karena notasi ilmiah. Saya telah mengirimkan tambalan ke llvm untuk memperbaikinya.

Tip lainnya adalah llvm-prof secara default hanya menampilkan 20 blok dasar yang paling banyak dieksekusi dan tidak memberikan pengguna cara apa pun untuk mengubahnya. Saya telah mengirimkan patch lain yang menambahkan parameter baris perintah yang memungkinkan pengguna untuk mengatur berapa banyak blok dasar yang dia inginkan dalam output.

person JohnTortugo    schedule 03.02.2013