سؤال

أحاول اكتشاف بعض معايير ضرب/انعكاس المصفوفات عبر الإنترنت.يمكن لتطبيق C++ الخاص بي حاليًا عكس مصفوفة 100 × 100 في 38 ثانية، ولكن بالمقارنة مع هذا المعيار الذي وجدته، أداء التنفيذ الخاص بي سيئ حقًا.لا أعرف ما إذا كان هذا شيئًا محسّنًا للغاية أو إذا كان بإمكانك بسهولة عكس مصفوفة 200 × 200 في حوالي 0.11 ثانية، لذلك أبحث عن المزيد من المعايير لمقارنة النتائج.هل لك بالله رابط جيد؟

تحديثلقد اكتشفت خطأً في رمز الضرب الخاص بي، ولم يؤثر ذلك على النتيجة ولكنه تسبب في إهدار الدورة عديمة الفائدة.الآن يتم تنفيذ الانعكاس الخاص بي في 20 ثانية.لا يزال هناك الكثير من الوقت، وأي فكرة هي موضع ترحيب.

شكرا لكم أيها الناس

هل كانت مفيدة؟

المحلول

هذا النوع من العمليات حساس للغاية لذاكرة التخزين المؤقت.تريد أن تقوم بمعظم عملك على المتغيرات الموجودة في ذاكرة التخزين المؤقت L1 وL2.راجع القسم 6 من هذا المستند:

http://people.redhat.com/drepper/cpumemory.pdf

يرشدك خلال عملية تحسين ضرب المصفوفة بطريقة محسنة لذاكرة التخزين المؤقت ويحصل على بعض التحسينات الكبيرة في الأداء.

نصائح أخرى

تحقق مما إذا كنت تقوم بتمرير كائنات مصفوفة ضخمة من حيث القيمة (حيث قد يكون ذلك مكلفًا في حالة نسخ المصفوفة بأكملها).
إذا كان ممكنا تمرير عن طريق المرجع.

الشيء المتعلق بالمصفوفات وC++ هو أنك تريد تجنب النسخ قدر الإمكان.
لذلك ربما لا ينبغي أن يحتوي كائنك الرئيسي على "بيانات المصفوفة" بل يحتوي على بيانات تعريفية حول المصفوفة ومؤشر (ملفوف بشيء ذكي) لجزء البيانات.وبالتالي، عند نسخ كائن، فإنك تقوم فقط بنسخ جزء صغير من البيانات وليس كل شيء (انظر تنفيذ السلسلة للحصول على مثال).

لماذا تحتاج إلى تنفيذ مكتبة المصفوفة الخاصة بك في المقام الأول؟كما اكتشفت بالفعل، هناك بالفعل مكتبات فعالة للغاية متاحة للقيام بنفس الشيء.وبقدر ما يحب الناس التفكير في C++ كلغة أداء، فهذا صحيح فقط إذا كنت كذلك حقًا جيد في اللغة.من السهل للغاية كتابة تعليمات برمجية بطيئة للغاية في لغة C++.

لا أعرف ما إذا كان هناك شيء محسّن فائقًا أو إذا كان بإمكانك حقًا قلب مصفوفة 200 × 200 في حوالي 0.11 ثانية

يقوم MATLAB بذلك دون بذل أي جهد أيضًا.هل تقوم بتنفيذ لاباك إجراءات لانعكاس المصفوفة (على سبيل المثالتحلل لو)؟

هل حاولت تعريفه؟

تتبع هذا ورق (pdf)، فإن حساب مصفوفة 100 × 100 مع تحلل LU سيحتاج إلى 1348250 (عمليات الفاصلة العائمة).يمكن لـ Core 2 القيام بحوالي 20 Gflops (مقاييس المعالج).لذلك من الناحية النظرية يمكنك إجراء انعكاس خلال 1 مللي ثانية.

بدون الكود، من الصعب جدًا تحديد سبب هذه الفجوة الكبيرة.من تجربتي في تجربة التحسين الجزئي مثل فتح الحلقة، وقيم التخزين المؤقت، والرؤية، والترابط، وما إلى ذلك، ستحصل فقط على سرعة، والتي في أحسن الأحوال ليست سوى عامل ثابت للتيار (والذي ربما يكون كافيًا بالنسبة لك).

ولكن إذا كنت ترغب في زيادة السرعة بشكل كبير، فيجب عليك إلقاء نظرة على الخوارزمية الخاصة بك، ربما يكون هناك خطأ في تنفيذ تحليل LU الخاص بك.مكان آخر لإلقاء نظرة عليه هو تنظيم بياناتك، وتجربة تنظيم مختلف، ووضع عناصر الصفوف/الأعمدة معًا.

ال لينباك وتستند المعايير على حل مشاكل الجبر الخطي.إنها متاحة للآلات المختلفة و اللغات.ربما يمكنهم مساعدتك أيضًا.

تتوفر مكتبات LINPACK C++ هنا, ، أيضاً.

لقد ربحت بالفعل حوالي 7 ثوانٍ باستخدام **double**س بدلا من **long double**s، ولكن هذا ليس بالأمر الكبير لأنني فقدت نصف دقتي.

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