Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2010, 00:08   #1
MBelka
 
Регистрация: 21.10.2010
Сообщений: 7
По умолчанию Паралельное вычисление матричных операций

Доброго времени суток. Поступила такая задача, язык С++:
Используя паралельные методы вычислить:
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];
но как их организовать по другому не знаю.
Суть ошибки в том, что программа компилируется, но при выполнении - тайна черного экрана >_< Видимо до вывода дело не доходит.
Если не затруднит, подскажите пожалуйста.

Последний раз редактировалось MBelka; 30.11.2010 в 00:30.
MBelka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПРОГРАММИРОВАНИЕ МАТРИЧНЫХ ОПЕРАЦИЙ Obrey Помощь студентам 5 17.12.2010 15:05
задачи по С++ параллельное нахождение векторно-матричных операций Microlab007 Помощь студентам 0 21.11.2010 13:02
программирование матричных операций! darinochka Microsoft Office Excel 4 11.10.2010 12:25
Автогруппировка, паралельное автозаполнение листов, пропуск пустых ячеек lema333 Microsoft Office Excel 17 10.08.2010 14:49
перегрузка операций nastya081108 Помощь студентам 0 18.05.2010 21:16