การรวบรวม LLVM Edge Profiling ด้วย llvm-prof

ฉันใช้คำสั่งเหล่านี้เพื่อรวบรวมโค้ดด้านล่างเพื่อรวบรวมโปรไฟล์ edge/blocks ใน 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

จากนั้นฉันรันโปรแกรมและแสดงข้อมูลโปรไฟล์โดยใช้ llvm-prof sort_prof.bc และผลลัพธ์คือ:

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

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

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

คำถามของฉันเกี่ยวกับความถี่ในการดำเนินการ มีเหตุผลไหมที่ดำเนินการหลัก 4.3e+05 ครั้ง? ทำไมเป็นเช่นนั้น? รหัสที่ฉันกำลังรวบรวมอยู่ด้านล่าง

###################### 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 แหล่งที่มา


คำตอบ (1)


ปัญหาคือฉันกำลังส่งไฟล์บิตโค้ดไปยัง llvm-prof พร้อมเครื่องมือวัด ที่ถูกต้องคือใช้ไฟล์ต้นฉบับ (โดยไม่มีเครื่องมือวัด):

llvm-prof sort.bc

ปัญหาอื่นที่เกี่ยวข้องกับ llvm-prof ก็คือมันปัดเศษความถี่ในการดำเนินการของฟังก์ชัน/บล็อกเนื่องจากสัญกรณ์ทางวิทยาศาสตร์ ฉันได้ส่งแพตช์ไปที่ llvm เพื่อแก้ไขสิ่งนั้นแล้ว

เคล็ดลับอีกประการหนึ่งคือ llvm-prof ตามค่าเริ่มต้นจะแสดงเฉพาะบล็อกพื้นฐานที่มีการดำเนินการมากที่สุด 20 อันดับแรกเท่านั้น และไม่ได้ให้วิธีใด ๆ แก่ผู้ใช้ในการเปลี่ยนแปลงสิ่งนั้น ฉันได้ส่งแพตช์อื่นที่เพิ่มพารามิเตอร์บรรทัดคำสั่งทำให้ผู้ใช้สามารถกำหนดจำนวนบล็อกพื้นฐานที่เขา/เธอต้องการในเอาต์พุต

person JohnTortugo    schedule 03.02.2013