سؤال

أتساءل عما إذا كان من الممكن استخدام 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 الخاص بك.

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