سؤال

أنا أجرب مع opencl لزيادة سرعة برنامجنا. نحن نعمل مع الخرائط كثيرًا ، وتبسيط ، تمثل خريطة كـ std :: vector <std :: vector>. يأخذ API OpenCl مؤشرات على غرار C الخام كوسيط ، على سبيل المثال int* في الحالة أعلاه.

أسئلتي:

  • هل هناك ضمانات تنفيذ في STL أن المتجه ، داخليًا ، متتالي في الذاكرة؟
  • هل يمكنني إلقاء ناقل STD :: بأمان إلى int* وأتوقع أن يعمل ذلك؟
  • في حالة متجه المتجهات ، هل ما زلت لا أزال افترض أن هذا صحيح؟ أتوقع أن يحتفظ المتجه ببيانات الدولة الأخرى ، أو مشكلات محاذاة ، أو ربما شيء آخر ...
  • ما هي أفضل طريقة لمعالجة هذا؟ اكتب بنية بيانات ثنائية الأبعاد مخصصة تحمل مخزنًا داخليًا داخليًا ومتجاوبًا في الذاكرة ويعمل مع ذلك؟ سأضطر إلى النسخ إلى/من المتجهات كثيرًا ...

شكرًا.

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

المحلول

هل هناك ضمانات تنفيذ في STL أن المتجه ، داخليًا ، متتالي في الذاكرة؟

اعتبارًا من C ++ 03 ، نعم ، يتم ضمان المتجه لاستخدام سعة التخزين المتجاورة. (في C ++ 98 ، كان هناك ثغرة عرضية ، لذا يمكن للتنفيذ استخدامًا افتراضيًا للتخزين غير المتواصل ، ولكن تم إصلاحه في مراجعة المعيار 2003 - ولا يوجد تنفيذ فعليًا تستخدم التخزين غير المتواصل لأنه سيكون فكرة رهيبة)

هل يمكنني إلقاء ناقل STD :: بأمان إلى int* وأتوقع أن يعمل ذلك؟

الطريقة المعتادة &v[0]. (&*v.begin() من المحتمل أن تعمل أيضًا ، لكن يبدو أنني أتذكر أن هناك بعض الصياغة الرقيقة في المعيار الذي يجعل هذا لا يمكن الاعتماد عليه بنسبة 100 ٪)

لا. لماذا تتوقع أن يعمل ذلك؟ المتجه هو فئة. إنه ليس مؤشرًا. فقط يحتوي على مؤشر.

في حالة متجه المتجهات ، هل ما زلت لا أزال افترض أن هذا صحيح؟ أتوقع أن يحتفظ المتجه ببيانات الدولة الأخرى ، أو مشكلات محاذاة ، أو ربما شيء آخر ...

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

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

نصائح أخرى

  • هل هناك ضمانات تنفيذ في STL أن المتجه هو ،
    داخليا ، متتالية في الذاكرة

نعم ، إنها مجموعة ديناميكية. يضمن قياسي أن الكائنات داخل المتجه مخزنة على التوالي.

  • هل يمكنني إلقاء ناقل STD :: بأمان إلى int* وأتوقع أن يعمل ذلك؟

لا ، ولكن يمكنك استخدام البداية () واستخدام ذلك كمؤشر.

  • هل هناك ضمانات تنفيذ في STL أن المتجه هو ،
    داخليا ، متتالية في الذاكرة

لا ، نظرًا لأن المتجه قد يحتوي

هل هناك ضمانات تنفيذ في STL أن المتجه ، داخليًا ، متتالي في الذاكرة؟

على الرغم من أنني لا أستطيع أن أقتبس من المعايير هنا ، فقد رأيت رمزًا في مكتبات عالية الجودة على افتراض هذا التصميم (أي ، بوكو).

هل يمكنني إلقاء ناقل STD :: بأمان إلى int* وأتوقع أن يعمل ذلك؟

على وجه التحديد ، لا يمكنك إعادة صياغة المتجه نفسه. لكنني رأيت الكود التالي:

std::vector<int> vec;
int* ptr = &vec[0];

في حالة متجه المتجهات ، هل ما زلت لا أزال افترض أن هذا صحيح؟ أتوقع أن يحتفظ المتجه ببيانات الدولة الأخرى ، أو مشكلات محاذاة ، أو ربما شيء آخر ...

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

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

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