ما مقدار الجهد الذي يجب أن تضعه للحصول على مكاسب من استخدام SSE؟

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

  •  26-09-2019
  •  | 
  •  

سؤال

الحالة الأولى

قل أن لديك فصل صغير:

class Point3D
{
private:
  float x,y,z;
public:
  operator+=()

  ...etc
};

Point3D &Point3D::operator+=(Point3D &other)
{
  this->x += other.x;
  this->y += other.y;
  this->z += other.z;
}

من شأن الاستخدام الساذج لـ SSE ببساطة استبدال أجسام الوظائف هذه باستخدام بعض الجوهارات. ولكن هل نتوقع أن يحدث هذا فرقًا كبيرًا؟ تستخدم MMX لإشراك Cahnges IIRC في حالة مكلفة ، هل SSE أم أنها مثل التعليمات الأخرى؟ وحتى إذا لم يكن هناك "استخدام SSE" مباشرة ، فهل سيحرك القيم إلى سجلات SSE والتراجع مرة أخرى تجعله أسرع؟

الحالة الثانية

بدلاً من ذلك ، أنت تعمل مع قاعدة كود أقل قائمة على OO. بدلاً من صفيف/متجه من كائنات point3d ، لديك ببساطة مجموعة كبيرة من العوامات:

float coordinateData[NUM_POINTS*3];

void add(int i,int j) //yes it's unsafe, no overlap check... example only
{
  for (int x=0;x<3;++x)
  {
    coordinateData[i*3+x] += coordinateData[j*3+x];
  }
}

ماذا عن استخدام SSE هنا؟ أي تحسن؟

ختاماً

هل تحاول تحسين عمليات المتجهات الفردية باستخدام SSE جديرة بالاهتمام بالفعل ، أم أنها ذات قيمة فقط عند القيام بعمليات بالجملة؟

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

المحلول

بشكل عام ، ستحتاج إلى اتخاذ خطوات إضافية للحصول على أفضل ما في SSE (أو أي بنية SIMD أخرى):

  • يجب أن تكون البيانات 16 بايت محاذاة (من الناحية المثالية)

  • يجب أن تكون البيانات متجاورة

  • تحتاج إلى بيانات كافية لجعل عملية SIMD جديرة بالاهتمام

  • تحتاج إلى تجميع أكبر عدد ممكن من العمليات لتخفيف تكاليف الأحمال/المتاجر

  • يجب أن تكون على دراية بتسلسل ذاكرة التخزين المؤقت/الذاكرة وتأثيره في الأداء (مثل استخدام الشريط/البلاط)

نصائح أخرى

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

وهناك مكتبات لديها كل SSE تحسين داخلها. لا تعيد اختراع الدراجة.

هذه مقال Gamasutra يوضح ما يتطلبه الأمر لصنع رمز سريع قائم على SSE. ويغطي "الحالة 1" بالتفصيل.

رمز المصدر متاح من المؤلف الصفحة الرئيسية.

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

نظرًا لأنك خمنت بشكل صحيح أن SSE هو الأكثر ملاءمة للعمليات السائبة حيث يمكنهم تقديم سرعة جيدة. قبل المضي قدمًا واستخدم SSE ، تحقق من الرمز الذي يولده برنامج التحويل البرمجي بالفعل. أعرف من التجربة أن Visual Studio على سبيل المثال جيد جدًا في استخدام SSE-Optimizations.

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