ما مدى سرعة تحويل الرياضيات ثلاثية الأبعاد إلى SSE أو SIMD أخرى؟

StackOverflow https://stackoverflow.com/questions/115291

سؤال

أنا أستخدم الرياضيات ثلاثية الأبعاد في طلبي على نطاق واسع.ما مقدار السرعة التي يمكنني تحقيقها عن طريق تحويل مكتبة المتجهات/المصفوفة الخاصة بي إلى SSE أو AltiVec أو رمز SIMD مشابه؟

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

المحلول

في تجربتي، أرى عادةً تحسنًا بمقدار 3x في نقل الخوارزمية من x87 إلى SSE، و أحسن تحسن بمقدار 5 مرات في الانتقال إلى VMX/Altivec (بسبب المشكلات المعقدة المتعلقة بعمق خط الأنابيب، والجدولة، وما إلى ذلك).لكنني عادةً ما أفعل ذلك فقط في الحالات التي يكون لدي فيها مئات أو آلاف الأرقام لأعمل عليها، وليس في الحالات التي أقوم فيها بإجراء متجه واحد في كل مرة بشكل مخصص.

نصائح أخرى

هذه ليست القصة بأكملها، ولكن من الممكن الحصول على مزيد من التحسينات باستخدام SIMD، قم بإلقاء نظرة على العرض التقديمي الذي قدمه ميغيل حول متى قام بتنفيذ تعليمات SIMD مع MONO والذي عقده في بي دي سي 2008,

SIMD beats doubles' ass in this particular configuration.
(مصدر: tirania.org)

صورة من دخول مدونة ميغيل.

بالنسبة لبعض الأرقام التقريبية للغاية:لقد سمعت بعض الناس على ompf.org يمكنك المطالبة بسرعات تصل إلى 10x لبعض إجراءات تتبع الأشعة المحسنة يدويًا.لقد حصلت أيضًا على بعض عمليات تسريع جيدة.أقدر أنني حصلت على ما بين 2x و 6x في إجراءاتي اعتمادًا على المشكلة، وكان العديد منها يحتوي على عدد من المتاجر والأحمال غير الضرورية.إذا كان لديك قدر كبير من التفرع في التعليمات البرمجية الخاصة بك، انسَ الأمر، ولكن بالنسبة للمشكلات التي تكون متوازية بشكل طبيعي مع البيانات، يمكنك القيام بذلك بشكل جيد.

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

على سبيل المثالشيء مثل

namespace SIMD {
class PackedVec4d
{
  __m128 x;
  __m128 y;
  __m128 z;
  __m128 w;

  //...
};
}

معظم المشاكل حيث يهم الأداء يمكن أن تكون متوازية لأنك ستعمل على الأرجح مع مجموعة بيانات كبيرة.مشكلتك تبدو وكأنها حالة من التحسين المبكر بالنسبة لي.

بالنسبة للعمليات ثلاثية الأبعاد، احذر من البيانات غير المهيأة في مكون W الخاص بك.لقد رأيت حالات حيث تستغرق عمليات SSE (_mm_add_ps) 10x من الوقت العادي بسبب البيانات السيئة في W.

تعتمد الإجابة بشكل كبير على ما تفعله المكتبة وكيفية استخدامها.

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

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

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

في هذه الأيام، يقوم جميع المترجمين الجيدين لـ x86 بإنشاء تعليمات SSE للرياضيات العائمة SP وDP بشكل افتراضي.يكون استخدام هذه التعليمات دائمًا أسرع من استخدام التعليمات الأصلية، حتى بالنسبة للعمليات العددية، طالما قمت بجدولتها بشكل صحيح.سيكون هذا بمثابة مفاجأة للكثيرين، الذين وجدوا في الماضي أن SSE "بطيء"، واعتقدوا أن المترجمين لا يمكنهم إنشاء تعليمات عددية سريعة لـ SSE.ولكن الآن، يتعين عليك استخدام مفتاح لإيقاف تشغيل إنشاء SSE واستخدام x87.لاحظ أنه تم إهمال الإصدار x87 بشكل فعال في هذه المرحلة وقد تتم إزالته من المعالجات المستقبلية بالكامل.النقطة السلبية الوحيدة في هذا هي أننا قد نفقد القدرة على القيام بتعويم DP 80 بت في التسجيل.ولكن يبدو أن الإجماع هو أنه إذا كنت تعتمد على 80 بت بدلاً من 64 بت DP من أجل الدقة، فيجب عليك البحث عن خوارزمية أكثر دقة لتحمل الخسارة.

كل ما سبق كان بمثابة مفاجأة كاملة بالنسبة لي.إنه أمر غير بديهي للغاية.لكن البيانات تتحدث.

على الأرجح لن ترى سوى سرعة صغيرة جدًا، إن وجدت، وستكون العملية أكثر تعقيدًا من المتوقع.لمزيد من التفاصيل انظر فئة ناقلات SSE في كل مكان مقال بقلم فابيان جيسين.

فئة ناقلات SSE في كل مكان:فضح أسطورة شائعة

ليس بهذه الأهمية

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

ليس ساخنا جدا

ليس سهلا

ليس الآن

قط

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