تحسين الاختلافات المحدودة مع SSE
-
26-09-2019 - |
سؤال
أتساءل عما إذا كان من الممكن استخدام SSE (1،2،3،4 ، ...) لتحسين الحلقة التالية:
// u and v are allocated through new double[size*size]
for (int j = l; j < size-1; ++j)
{
for (int k = 1; k < size-1; ++k)
{
v[j*size + k] = (u[j*size + k-1] + u[j*size + k+1]
+ u[(j-1)*size + k]+ u[(j+1)*size + k]) / 4.0;
}
}
ال [j*size + k]
يتم استخدام المصطلح لعلاج كتلة الذاكرة كما لو كانت صفيف متعدد الأبعاد.
للأسف -ftree-vectorize
لا يعتقد Flag for GCC (4.5) أن الحلقة قابلة للتحسين من نوع SIMD. (على الرغم من القول أنني لم أر قط من قبل -ftree-vectorize
تحسين أي شيء سوى أكثر الحلقات تافهة.)
على الرغم من أنني أدرك أن هناك العديد من الطرق الأخرى لتحسين أداء الحلقة (OpenMP ، الخوارزميات غير المحددة ، وما إلى ذلك) ، أنا مهتم على وجه التحديد بمعرفة ما إذا كان يمكن استخدام SIMD. ربما أكون أكثر اهتمامًا بالمخطط العام لكيفية تحويل مثل هذه الحلقة (إن وجدت) ، بدلاً من التنفيذ الملموس.
المحلول
يبدو أنه يجب أن يكون ذلك ممكنًا ، ولكن نظرًا لأن (أ) تستخدم الزوجي ، (ب) ، فأنت تقوم بحساب قليل جدًا بالنسبة إلى I/O ، (ج) معظم وحدات المعالجة المركزية X86-64 الحديثة لها اثنين من FPUs على أي حال ، ثم قد لا تحصل على الكثير من العائد على استثمار ترميز SIMD الخاص بك.