سؤال

أنا بحاجة إلى وسيلة لتمثيل 2-D array (كثيفة المصفوفة) من الزوجي في C++, مع الحد الأدنى المطلق الوصول إلى النفقات العامة.

لقد فعلت بعض التوقيت على مختلف لينكس/يونيكس و دول مجلس التعاون الخليجي الإصدارات.STL ناقلات ناقلات ، أعلن:

vector<vector<double> > matrix(n,vector<double>(n));

والوصول إليها من خلال matrix[i][j] ما بين 5 ٪ و 100 ٪ أبطأ من مجموعة أعلن:

double *matrix = new double[n*n];

الوصول إليها من خلال inlined مؤشر وظيفة matrix[index(i,j)], حيث index(i,j) يقيم i+n*ي.طرق أخرى لترتيب 2-D array دون STL - مجموعة من n مؤشرات بداية كل صف ، أو تحديد كل ما حدث على كومة المستمر الحجم matrix[n][n] - تشغيل عند بالضبط تقريبا بنفس سرعة مؤشر وظيفة الأسلوب.

الأخيرة إصدارات دول مجلس التعاون الخليجي (> 4.0) يبدو أن تكون قادرة على تجميع المحكمة الخاصة بلبنان ناقل من النواقل إلى ما يقرب من كفاءة نفس غير المحكمة أمثلية التعليمات البرمجية عند تشغيل ، ولكن هذا هو إلى حد ما الجهاز تعتمد على.

أود أن استخدام المحكمة إذا كان ذلك ممكنا ، ولكن سيكون لديك لاختيار أسرع حل.هل من أحد لديه أي خبرة في تحسين المحكمة مع دول مجلس التعاون الخليجي ؟

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

المحلول

إذا كنت تستخدم دول مجلس التعاون الخليجي المترجم يمكن تحليل مصفوفة يصل وتغيير النظام في الذاكرة في بعض الحالات.السحر مترجم العلم بأنها:

-fipa-matrix-reorg

تنفيذ مصفوفة تسطيح ، منقولة.مصفوفة تسطيح يحاول لاستبدال م الأبعاد مع ما يعادلها ن الأبعاد مصفوفة ، حيث n < م.هذا يقلل من مستوى المراوغة اللازمة للوصول إلى عناصر المصفوفة.الثاني الأمثل هو مصفوفة نقل أن يحاولوا تغيير ترتيب مصفوفة أبعاد من أجل تحسين ذاكرة التخزين المؤقت المحلية.سواء أمثل تحتاج fwhole-برنامج العلم.نقل تمكين إلا إذا التنميط المعلومات متوافرة.

علما أنه لم يتم تمكين هذا الخيار من قبل -O2 -O3.لديك لتمرير ذلك بنفسك.

نصائح أخرى

أعتقد سيكون أسرع هو مصفوفة استخدام 1D الخاصة بلبنان مجموعة تجاوز () المشغل استخدامه كما 2D مصفوفة.

ومع ذلك ، فإن المحكمة تحدد أيضا نوع خصيصا عدم لتغيير الحجم العددي المصفوفات:valarray.لديك أيضا مختلف أمثلية في مكان العمليات.

valarray قبول الحجة العددية نوع:

valarray<double> a;

ثم يمكنك استخدام شرائح غير مباشرة المصفوفات ، ...وبالطبع يمكنك أن ترث valarray و تحديد المشغل الخاصة بك()(int i, int j) على صفائف 2D ...

من المرجح جدا أن هذا هو موقع من المرجع المسألة. vector يستخدم new تخصيص الداخلية مجموعة, بحيث كل صف سوف تكون على الأقل قليلا بعيدا في الذاكرة بسبب كل كتلة في رأس ؛ يمكن أن يكون هناك مسافة طويلة بعيدا إذا كانت الذاكرة المجزأة بالفعل عند تخصيص لهم.صفوف مختلفة من مجموعة من المرجح أن على الأقل تحمل ذاكرة التخزين المؤقت الخط خطأ يمكن أن تتحمل صفحة خطأ ؛ إذا كنت سيئ الحظ اثنين من الصفوف المتجاورة يمكن أن يكون على خطوط الذاكرة التي تشترك TLB فتحة الوصول إلى أحد طرد الأخرى.

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

vector تم تصميم يمكن تغيير حجم المصفوفات.إذا كنت لا تحتاج إلى تغيير حجم المصفوفات ، استخدام منتظم C++ مجموعة.المحكمة الخاصة بلبنان العمليات يمكن أن تعمل عموما على C++ المصفوفات.

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

توصيتي سيكون لاستخدام دفعة.UBLAS الذي يوفر سرعة مصفوفة/ناقلات الطبقات.

أن تكون عادلة يعتمد على خوارزميات كنت تستخدم على المصفوفة.

مزدوجة اسم[n*m] شكل سريع جدا عندما يتم الوصول إلى البيانات من خلال الصفوف سواء بسبب يكاد لا يملك أي النفقات العامة إلى جانب الضرب و الجمع و لأن الصفوف معبأة البيانات من شأنها أن تكون متسقة في ذاكرة التخزين المؤقت.

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

في محاولة لجعل بعض البحوث الموجهة إلى نوع من الاستخدام و الخوارزميات التي تستخدمها.وهذا هو المهم خصيصا إذا كانت مصفوفة كبيرة جدا ، لأن ذاكرة التخزين المؤقت يفتقد قد يضر بك أداء أكثر من الحاجة 1 أو 2 إضافية عمليات الرياضيات للوصول إلى كل عنوان.

هل يمكن بسهولة مثلما تفعل ناقلات< مزدوجة >( n*m) ؛

قد ترغب في النظر في Eigen C++ قالب مكتبة في http://eigen.tuxfamily.org/ .فإنه يولد AltiVec sse2 أو رمز لتحسين ناقلات/مصفوفة الحسابات.

هناك uBLAS في تنفيذ دفعة.فإن الأمر يستحق نظرة.

http://www.boost.org/doc/libs/1_36_0/libs/numeric/ublas/doc/matrix.htm

آخر ذات الصلة مكتبة الغارة++: http://www.oonumerics.org/blitz/docs/blitz.html

مداهمات++ يهدف إلى تحسين مجموعة التلاعب.

لقد فعلت هذا بعض الوقت إلى الوراء على الصور الخام من خلال إعلان بلدي 2 الأبعاد مجموعة فصول.

في العادية 2D array ، يمكنك الوصول إلى عناصر مثل:

مجموعة[2][3].الآن للحصول على هذا التأثير سيكون لديك مجموعة فئة مع طاقتها [] مجموعة accessor.ولكن هذا أساسا عودة مجموعة أخرى ، مما كنت البعد الثاني.

المشكلة مع هذا النهج هو أنه لديه وظيفة مزدوجة دعوة علوية.

الطريقة التي فعلت ذلك تم استخدام () أسلوب الزائد.

وذلك بدلا من مجموعة[2][3] ، تغيير كان يفعل هذا النمط مجموعة(2,3).

أن () وظيفة صغيرة جدا و أنا متأكد أنه المضمنة.

انظر هذا الرابط المفهوم العام أن:http://www.learncpp.com/cpp-tutorial/99-overloading-the-parenthesis-operator/

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

من الصعب أن أشرح بدون كود ولكن أساسا كانت النتيجة بأسرع ج ، و أسهل بكثير لفهم واستخدام.

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