سؤال

لدي رمز مضاعف مصفوفة يتكاثر المصفوفة بما يلي حيث المصفوفة A * Matrix B = Matrix C

for(j=1;j<=n;j++) {
 for(l=1;l<=k;l++) {
  for(i=1;i<=m;i++) {
   C[i][j] = C[i][j] + B[l][j]*A[i][l];

 }
}

الآن أريد تحويله إلى مصفوفة متعددة الخيوط مضاعفة والرمز الخاص بي كما يلي:

أنا استخدم بنية

struct ij
{
 int rows;
 int columns;
};

طريقتي هي

void *MultiplyByThread(void *t)
{
 struct ij *RowsAndColumns = t;
 double total=0; 
 int pos; 
 for(pos = 1;pos<k;pos++)
 {
  fprintf(stdout, "Current Total For: %10.2f",total);
  fprintf(stdout, "%d\n\n",pos);
  total += (A[RowsAndColumns->rows][pos])*(B[pos][RowsAndColumns->columns]);
 }
 D[RowsAndColumns->rows][RowsAndColumns->columns] = total;
 pthread_exit(0);

}

وداخلتي الرئيسية

      for(i=1;i<=m;i++) {
        for(j=1;j<=n;j++) {

   struct ij *t = (struct ij *) malloc(sizeof(struct ij));
   t->rows = i;
   t->columns = j;

    pthread_t thread;
    pthread_attr_t threadAttr;
    pthread_attr_init(&threadAttr);
    pthread_create(&thread, &threadAttr, MultiplyByThread, t);    
    pthread_join(thread, NULL);    

        }
      }

لكن لا يبدو لي أن أحصل على نفس النتيجة التي تتكاثرها المصفوفة الأولى (التي هي صحيحة) هل يمكن لأي شخص أن يوجهني إلى الاتجاه الصحيح؟

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

المحلول

رمز الخيوط الخاص بك غير مرتبط ، في الواقع. يمكنك إنشاء موضوع وانتظر إكماله عن طريق الاتصال بالانضمام بعد الاتصال بالإنشاء مباشرة. يجب عليك إنشاء مصفوفة من مؤشرات الترابط MXN ، وإطلاقها جميعًا ، ثم الانضمام إليها جميعًا. بصرف النظر عن ذلك ، يبدو أن الكود يحسب نفس الحلقة. ما هو التناقض الدقيق مع النتائج؟

مثال (ملاحظة ، لا يتم تجميعها):

pthread_t threads[m][n]; /* Threads that will execute in parallel */

ثم بشكل رئيسي:

 for(i=1;i<=m;i++) {
    for(j=1;j<=n;j++) {

    struct ij *t = (struct ij *) malloc(sizeof(struct ij));
    t->rows = i;
    t->columns = j;

    pthread_attr_t threadAttr;
    pthread_attr_init(&threadAttr);
    pthread_create(thread[i][j], &threadAttr, MultiplyByThread, t);    
    }
  }

  /* join all the threads */
  for(i=1;i<=m;i++) {
    for(j=1;j<=n;j++) {
       pthread_join(thread[i][j], NULL);
    }
  }

(أكثر أو أقل ، فقط عدم الاتصال pthread_join لكل موضوع داخل الحلقة).

نصائح أخرى

حاول القيام بما يلي:

#pragma omp for private(i, l, j)
for(j=1;j<=n;j++) {
    for(l=1;l<=k;l++) {
        for(i=1;i<=m;i++) {
            C[i][j] = C[i][j] + B[l][j]*A[i][l];
        }
    }
}

بينما googling لمفتاح برنامج التحويل البرمجي لجامعة GCC لتمكين OpenMP ، صادفت بالفعل عبر منشور المدونة هذا هذا يصف ما يحدث أفضل مما أستطيع ، ويحتوي أيضًا على مثال أفضل.

يتم دعم OpenMP على معظم المجمعين ذوي الصلة بآلات متعددة ، انظر موقع الويب OpenMP للمزيد من المعلومات.

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