#include <omp.h>
int main()
{
int m,n,p,k,i,j,ibeg;
float ce,a[1000][1000],b[1000][1000],c[1000][1000];
ifstream ffin("input1.txt");
ifstream ftin("input2.txt");
ofstream fout("output.txt");
ffin>>m>>n;
ftin>>p>>k;
if(n!=p) {fout<<"Problem with size!!!";return 0;}
ce=0;
#pragma omp parallel //запуск двух нитей для
{ //чтения из двух файлов
if(OMP_GET_THREAD == 0)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
ffin>>a[i][j];
}
if (OMP_GET_THREAD == 1)
{
for(i=0;i<p;i++)
for(j=0;j<k;j++)
ftin>>b[i][j];
}
}
ibeg = clock(); //запускаем секундомер
omp_set_dtnamic(1); //разрешаем изменять кол-во нитей
omp_set_num_threads(10); //запускаем еще 9 нитей
#pragma omp parallel
#pragma omp parallel for SCHEDULE (STATIC)
for(i=0;i<m;i++) //параллельное выполнение
for(j=0;j<k;j++) //произведения матриц
{
for(p=0;p<n;p++)
ce = ce + a[i][p] * b[p][j];
c[i][j]=ce;
ce=0;
}
fout<<(clock()-ibeg)/CLOCKS_PER_SEC<<"\n"; //вывод секундомера
for(i=0;i<m;i++)
{
for(j=0;j<k;j++) //вывод результата произведения матриц
fout<<c[i][j]<<" ";
fout<<"\n";
}
return 0; }