سؤال

أرغب في قياس ذخيرة النقطة العائمة والعمليات الحسابية التي يتم تنفيذها بواسطة بعض التطبيقات مع "Perf" ، أمر واجهة سطر الأوامر الجديد إلى نظام Linux Performance Counter. (لأغراض الاختبار ، أستخدم تطبيقًا وهمية بسيطًا قمت بإنشائه ، انظر أدناه).

لأنني لم أتمكن من العثور على أي أحداث "perf" محددة لقياس عمليات FP و Integer ، بدأت في الحفر في رموز أحداث الأجهزة الأولية (لاستخدامها مع -rnnn ، حيث NNN هي القيمة السداسية لرمز الحدث). لذا فإن مشكلتي الحقيقية هي أن الرموز التي وجدتها للتعليمات المتقاعدة (Inst_Retired) لا تميز بين FP والتعليمات الأخرى (X87 و MMX/SSE). عندما حاولت استخدام umasks المناسبة للرمز المعين ، اكتشفت أن "perf" بطريقة أو بأخرى لا يفهم أو يدعم إدراج umask. حاولت مع:

% perf stat -e rC0 ./a.out

الذي يعطيني التعليمات المتقاعدة ، ولكن

% perf stat -e rC002 ./a.out 

مما يجب أن يعطيني تعليمات X87 التي تم تنفيذه تقول إنني قدمت معلمات خاطئة. ربما ، ولكن ما هي الطريقة الصحيحة لاستخدام ubmsks من أحداث الأجهزة الخام مع "perf"؟ بشكل عام ، ما هي الطريقة للحصول على العدد الدقيق لعمليات النقطة العائمة والعمليات الصحيح التي تم تنفيذها باستخدام أداة Perf؟

شكرا جزيلا ، كونستانتين بويانوف


ها هو تطبيق الاختبار الخاص بي:

int main(void){
  float  numbers[1000];
  float res1;
  double doubles[1000];
  double res2;

  int i,j=3,k=42;

  for(i=0;i<1000;i++){
    numbers[i] = (i+k)*j;
    doubles[i] = (i+j)*k;
    res1 = numbers[i]/(float)k;
    res2 = doubles[i]/(float)j;
  }
}
هل كانت مفيدة؟

المحلول

يعتمد الحدث لاستخدامه على المعالج. يمكنك استخدام libpfm4 (http://perfmon2.git.sourceforge.net/git/gitweb-index.cgi) لتحديد أي الأحداث المتاحة (باستخدام برنامج showevinfo) رموز الحدث. يدعم وحدة المعالجة المركزية Sandy Bridge الخاصة بي حدث FP_COMP_OPS_EXE الذي وجدته تجريبياً يتوافق بشكل وثيق مع عدد التقليب.

نصائح أخرى

لست متأكدًا من Perf ، لكن Oprofile لديه أحداث نقطة عائمة للعديد من المعالجات. قد يكون هناك بعض التداخل ، حيث أن Inst_Retired هو حدث ساري المفعول أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top