قياس التقلبات من التطبيق مع أداة Linux Perf
سؤال
أرغب في قياس ذخيرة النقطة العائمة والعمليات الحسابية التي يتم تنفيذها بواسطة بعض التطبيقات مع "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 هو حدث ساري المفعول أيضًا.