Умножение матриц с использованием потоков Win32 - PullRequest
1 голос
/ 20 мая 2011

У меня есть работающий код с 9 потоками для работы с матрицей 3 * 3. Я хочу сделать количество потоков входным от пользователя. Но я не могу разделить матрицу, например, только на 4 потока. Любая помощь будет оценена. спасибо:)

#include<iostream>
#include <stdio.h>
#include <cstdlib>
#include <ctime>
#include<windows.h>
using namespace std;
int nGlobalCount = 0;
int thread_index = 0;
int num_of_thr=9;

int a[3][3] , b[3][3] , c[3][3];
int i , j , k;

struct v {
  int i; /*row*/
  int j; /*column*/
};
DWORD ThreadProc (LPVOID lpdwThreadParam ) {
   struct v *input = (struct v *)lpdwThreadParam ;
   int avg=4*4/9;
   for(int n=0; n<avg; n++) {
      int sum=0;
      for ( k = 0 ; k < 3; k++) {
        sum=sum+((a[input->i][k])*(b[k][input->j]));
        c[input->i][input->j]=sum;
        if(j<3 && avg!=1)
            j=j+1;
        else if (j==3 && avg!=1 && (avg-n)!=1)
            i=i+1;

        }
    }

cout<<"the number of the thread "<<thread_index<<endl;
return 0;

}
int main() {

DWORD ThreadIds[9];
HANDLE ThreadHandles[9];

struct v data[9];

for ( int i = 0 ; i < 3; i++) {
    for (int j = 0 ; j < 3 ; j++) {
        a[i][j] = rand() % 10;
        b[i][j] = rand() % 10;
        c[i][j] = 0;
        }
    }

for ( int i=0 ; i < 3; i++) {
    for(int j=0 ; j <3; j++) {
        data[thread_index].i = i;
        data[thread_index].j = j;


        ThreadHandles[thread_index] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadProc, &data[thread_index], 0,&ThreadIds[thread_index]);

        thread_index++;


        }
    }

WaitForMultipleObjects(num_of_thr, ThreadHandles, TRUE, INFINITE);


cout<<"The matrix A is "<<endl;
for ( i = 0 ; i < 3; i++) {
    for ( j = 0 ; j < 3 ; j++)
        cout<<a[i][j]<<" ";
    cout<<endl;
    }
cout<<"The  matrix B is "<<endl;
for ( i = 0 ; i < 3; i++) {
    for ( j = 0 ; j < 3 ; j++)
        cout<<b[i][j]<<" ";
    cout<<endl;
    }
    cout<<"The resultant matrix is "<<endl;
for ( i = 0 ; i < 3; i++) {
    for ( j = 0 ; j < 3 ; j++)
        cout<<c[i][j]<<" ";
    cout<<endl;
    }
for (int i=0; i<9; i++) CloseHandle(ThreadHandles[i]);
return 0;
}

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Как отмечается в некоторых комментариях, вы не увидите никакой загрузки системы на матрице 3x3.Стоимость порождения новых потоков слишком высока.

В общем, вы можете попробовать потокобезопасную очередь задач.По сути, просто обычная очередь с семафорами в нужных местах.Поместите все индексы, которые еще нужно вычислить, в очередь.Каждый поток захватывает следующий индекс с начала очереди (удаляя его), а затем вычисляет и заполняет соответствующую ячейку матрицы решения, прежде чем выбрать другое задание из очереди.Мне кажется, что потокобезопасные реализации очередей довольно распространены, поэтому не должно быть сложно найти такую ​​для ваших целей.

Это дает дополнительное преимущество, заключающееся в том, что вы можете добавлять больше потоков в режиме реального времени или удалять их, если хотите.Это более общий способ распараллеливания вещей.

1 голос
/ 20 мая 2011

Я подозреваю, что часть проблемы может лежать в этой строке внутри вашего threadproc:

int avg=4*4/9;

Это будет константа 1, которая может быть не тем, что вы хотите (16/9 как int равно 1 (напоминание 7)). А это в свою очередь означает, что ваш внешний цикл (n) будет выполняться только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...