Доброго времени суток. Поступила такая задача, язык С++:
Используя паралельные методы вычислить:
MQ = MA*MB+3*MC
где MA – матрица размером N1xN2;
MB – матрица размером N2xN3;
MC – матрица размером N1xN3.
Все элементы матриц установить = 1
Код:
#include <pthread.h>
#include <semaphore.h>
#include <iostream>
using namespace std;
const int k=6;
const int N1=10, N2=15, N3=20;
int MA[N1][N2], MB[N2][N3], MC[N1][N3], MQ[N1][N3];
sem_t s_inpMA, s_inpMB, s_inpMC, s_outMQ;
pthread_mutex_t mutex;
void*Func_T(void*arg)
{
int i,j,l;
int NumThread=(int)arg; //переменная, содержащяя в себе номер потока
if(NumThread==0)
{
for (i=0; i<N1; i++) //заполнение матрицы МА
for (j=0; j<N2; j++)
MA[i][j]=1;
for (i=0; i<k; i++)
sem_post (&s_inpMA); //сигнал о заполнении МА
for (j=0; j<N2; j++) //заполнение матрицы МВ
for (l=0; l<N3; l++)
MB[j][l]=1;
for (i=0; i<k; i++)
sem_post (&s_inpMB); //сигнал о заполнении МВ
for (i=0; i<N1; i++) //заполнение матрицы МС
for (l=0; l<N3; l++)
MC[i][l]=1;
for (i=0; i<k; i++)
sem_post (&s_inpMC); //сигнал о заполнении МС
pthread_mutex_lock (&mutex);
for (i=N1/k; i<2*N1/k; i++) //вычисление матрицы MQ
for (j=N2/k; j<2*N2/k; j++)
for (l=N3/k; j<2*N3/k; l++)
MQ[i][l]=MA[i][j]*MB[j][l]+3*MC[i][l];
sem_post (&s_outMQ); //сигнал об окончании вычисления матрицы MQ
pthread_mutex_unlock (&mutex);
}
else
{
while (1)
{
sem_wait (&s_inpMA); //ожидание МА
sem_wait (&s_inpMB); //ожидание МВ
sem_wait (&s_inpMC); //ожидание МС
pthread_mutex_lock (&mutex);
for (i=(NumThread+1)*N1/k; i<(NumThread+2)*N1/k; i++) //вычисление матрицы MQ
for (j=(NumThread+1)*N2/k; j<(NumThread+2)*N2/k; j++)
for (l=(NumThread+1)*N3/k; l<(NumThread+2)*N3/k; l++)
MQ[i][l]=MA[i][j]*MB[j][l]+3*MC[i][l];
for (i=0; i<k-1; i++);
sem_post (&s_outMQ); //сигнал об окончании вычисления матрицы MQ
pthread_mutex_unlock (&mutex);
}
}
}
int main ()
{
sem_init (&s_inpMA,0,0); //инициализация семафоров
sem_init (&s_inpMB,0,0);
sem_init (&s_inpMC,0,0);
sem_init (&s_outMQ,0,0);
pthread_mutex_init (&mutex, NULL); //инициализация мютекса
pthread_t T[k]; //инициализация потока
int i,j,l;
for (i=0; i<k; i++) //создание потока
pthread_create (&T[i], NULL, Func_T, NULL);
sem_wait (&s_inpMA); //ожидание МА
sem_wait (&s_inpMB); //ожидание МВ
sem_wait (&s_inpMC); //ожидание МС
while (1)
{
pthread_mutex_lock (&mutex);
for (i=0; i<N1/k; i++) //вычисление матрицы MQ
for (j=0; j<N2/k; j++)
for (l=0; j<N3/k; l++)
MQ[i][l]=MA[i][j]*MB[j][l]+3*MC[i][l];
for (i=0; i<k; i++);
sem_post (&s_outMQ); //сигнал об окончании вычисления матрицы MQ
pthread_mutex_unlock (&mutex);
}
for (i=0; i<k-1; i++)
sem_wait (&s_outMQ); //ожидание МQ
for (i=0; i<N1; i++)
{
for (l=0; l<N3; l++)
cout<<MQ[i][l]<<'\n'; //вывод МQ
cout<<'\n';
}
cin>>i;
return 0;
}
Почти уверена в том, что проблема в этих циклах:
Код:
for (i=N1/k; i<2*N1/k; i++)
for (j=N2/k; j<2*N2/k; j++)
for (l=N3/k; j<2*N3/k; l++)
MQ[i][l]=MA[i][j]*MB[j][l]+3*MC[i][l];
Код:
for (i=(NumThread+1)*N1/k; i<(NumThread+2)*N1/k; i++)
for (j=(NumThread+1)*N2/k; j<(NumThread+2)*N2/k; j++)
for (l=(NumThread+1)*N3/k; l<(NumThread+2)*N3/k; l++)
MQ[i][l]=MA[i][j]*MB[j][l]+3*MC[i][l];
Код:
for (i=0; i<N1/k; i++)
for (j=0; j<N2/k; j++)
for (l=0; j<N3/k; l++)
MQ[i][l]=MA[i][j]*MB[j][l]+3*MC[i][l];
но как их организовать по другому не знаю.
Суть ошибки в том, что программа компилируется, но при выполнении - тайна черного экрана >_< Видимо до вывода дело не доходит.
Если не затруднит, подскажите пожалуйста.