Program matrice u C-u

Program matrice u C-u

offline
  • Pridružio: 01 Nov 2011
  • Poruke: 3

Imam problem u vezi programa u C-u, Mnozenje matrica je tema, napisala sam program, ali kako se radi o optimizovanom programiranju, da bih iskoristila ceo CPU, treba matrice da podelim na blokove (onda uzima prva dva bloka iz prve matrice, smesta u KES, mnozi ih, kada njih zavrsi uzima sledece...). E imam kod za mnozenje matrica na koji treba da primenim podelu na blokove. Matrice su kvadratne. Takodje, pored deljenja matrica i njihovog posebnog obradjivanja, postoji jos jedan problem. To je kad se podele matrice i izmnoze onda se gubi deo resenja.
Recimo za imas matricu 4x4 koja se deli na 4 dela.

c[1][1] = a[1][1] b[1][1] + a[1][2] b[2][1] + a[1][3] b[3][1] + a[1][4] b[4][1]

a ako se izmnozi matrica 2 x 2 resenja su

c[1][1] = a[1][1] b[1][1] + a[1][2] b[2][1]

tako da gubis dva clana, pitanje je kako da se sacuva c[1][1] u neku privremenu promenjivu dok ne dodjemo do matrica koje daju rezultate za a[1][3] b[3][1] i a[1][4] b[4][1] i kako to da se sabere da bi se dobilo konacno c[1][1]?
kod na koji treba da se implementira je:

#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <math.h>
#define NB 4

double gettime(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + 1e-6 * tv.tv_usec;
}

void fill_mat(double* mat, int N, double val) {
int i, j;

for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
mat[N * i + j] = val;
}

void mul(double* dest, const double* a, const double* b, int N) {
int i, j, k;
double c,c1,c2,c3;
// mislila sam negde oko ovog bloka, jer je glavni, da ubacim podelu matrica//
for (k = 0; k < N; k ++) {
for (i = 0; i < N; i +=4) {
c = a[i * N + k];
for (j = 0; j < N; j ++) {
dest[i * N + j] += c * b[k * N + j];
}
}
}
}
}

void print_mat(double* mat, int N) {
int i, j;

for (i = 0; i < N; i ++) {
for (j = 0; j < N; j ++) {
printf ("%f ", mat[i * N + j]);
}
printf ("\n");
}
}

int main(int args, char* argv[])
{
const int M = atoi(argv[1]);
double TFlops;
double* A = (double*) malloc(M * M * sizeof(double));
double* B = (double*) malloc(M * M * sizeof(double));
double* C = (double*) malloc(M * M * sizeof(double));

fill_mat(A, M, 1.0);
fill_mat(B, M, 2.0);
fill_mat(C, M, 0.0);

double t = gettime();
mul(C, A, B, M);
t = gettime() - t;

TFlops = 2. * pow(M,3) / t;


printf("%d %f %f\n", M, t, TFlops);
//print_mat(C, M);

free(A);
free(B);
free(C);
return 0;
}

Ukoliko neko moze da mi pomogne, bila bih jako zahvalna Smile



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
Ko je trenutno na forumu
 

Ukupno su 1163 korisnika na forumu :: 43 registrovanih, 6 sakrivenih i 1114 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., antonije64, bojcistv, Boris BM, ccoogg123, darkangel, Darko001, Dimitrise93, draganca, dragoljub11987, drimer, esx66, FileFinder, Frunze, galerija, gomago, Još malo pa deda, Karla, Krvava Devetka, kunktator, laganini123, Marko Marković, Metanoja, milenko crazy north, Milometer, moldway, mrvica78, nemkea71, Nobunaga, radoznao, repac, RJ, Sirius, slonic_tonic, Stanlio, Trpe Grozni, uruk, Vlada1389, vladulns, wizzardone, wolf431, Zoca, žeks62