Napisałem program do mnożenia macierzy (dwie pary w dwóch osobnych wątkach). Chodzi głównie o to żeby porównać czas działania z jednowątkowym (dlatego tyle pętli robię). Niestety nie dość, że dwuwątkowy działa mi dłużej od jednowątkowego, to jeszcze lubi się wysypać w momencie obliczeń. Co może być w tym kodzie nie tak?
Oto i on:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
clock_t start, finish;
double duration;
int w,k,i,j,x,y;
int * tab_aa,* tab_bb,* tab_cc,* tab_dd;
DWORD WINAPI ThreadProc1(void* param)
{
for(int p=0; p<9000; p++)
{
for(i=0; i<x; i++)
for(j=0; j<y; j++)
*(tab_cc+i*y+j)=0;
for(i=0; i<x; i++)
for(j=0; j<y; j++)
for(k=0; k<y; k++)
*(tab_cc+i*y+j) += *(tab_aa+i*y+k) * *(tab_aa+k*y+j);
}
return TRUE;
}
DWORD WINAPI ThreadProc2(void* param)
{
for(int p=0; p<5000; p++)
{
for(i=0; i<x; i++)
for(j=0; j<y; j++)
*(tab_dd+i*y+j)=0;
for(i=0; i<x; i++)
for(j=0; j<y; j++)
for(k=0; k<y; k++)
*(tab_dd+i*y+j) += *(tab_bb+i*y+k) * *(tab_bb+k*y+j);
}
return TRUE;
}
int main()
{
DWORD threadID,threadID1;
DWORD thread_arg = 4;
DWORD threadId[2];
HANDLE hThreads[2];
HANDLE hThread1,hThread;
printf("MNOZENIE MACIERZY KWADRATOWYCH 3-WYMIAROWYCH\n\n");
x=2;
y=2;
tab_aa = (int *)malloc(sizeof(int)*x*y);
tab_bb = (int *)malloc(sizeof(int)*x*y);
tab_cc = (int *)malloc(sizeof(int)*x*y);
tab_dd = (int *)malloc(sizeof(int)*x*y);
printf("Wprowadz wartosci do pierwszej pary macierzy:\n");
for(i=0; i<x; i++)
{
printf("Wiersz %d\n", i+1);
for(j=0; j<y; j++)
scanf_s("%d",tab_aa+i*y+j);
}
printf("Wprowadz wartosci do drugiej pary macierzy:\n");
for(i=0; i<x; i++)
{
printf("Wiersz %d\n", i+1);
for(j=0; j<y; j++)
scanf_s("%d",tab_bb+i*y+j);
}
start = clock();
//pierwsza para
hThreads[0] = CreateThread( NULL, 0, ThreadProc1, NULL, 0, &threadId[0] );
//druga para
hThreads[1] = CreateThread( NULL, 0, ThreadProc2, NULL, 0, &threadId[1] );
WaitForMultipleObjects(2,hThreads,TRUE,INFINITE);
for(i=0;i<2;i++) CloseHandle(hThreads[i]);
finish = clock();
duration = (double)(finish - start)/CLOCKS_PER_SEC;
printf("Wynik mnozenia pierwszej pary macierzy:\n");
for(i=0; i<x; i++)
for(j=0; j<y; j++)
printf("%d %d = %d\n",i+1,j+1,*(tab_cc+i*y+j));
printf("Wynik mnozenia drugiej pary macierzy:\n");
for(i=0; i<x; i++)
for(j=0; j<y; j++)
printf("%d %d = %d\n",i+1,j+1,*(tab_dd+i*y+j));
printf( "\n\nCzas wykonywania programu %3.6f s\n", duration ) ;
free(tab_aa);
free(tab_bb);
free(tab_cc);
free(tab_dd);
system("PAUSE");
return 0;
}
P.S. Najlepsze jest to, że po lekkiej modyfikacji kodu pod Linuxa, program działa IDEALNIE (na Fedorze 8)