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 906 korisnika na forumu :: 42 registrovanih, 7 sakrivenih i 857 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., aljosa7, atrkulja, babaroga, bato, branko7, brundo65, cikadeda, cole77, crnitrn, dac, Dannyboy, darkstar101, DH, Dimitrise93, djboj, eighty-one, Georgius, helen1, Insan, kolateralnasteta, madza, MarKhan, Megapurpletv, Nebo_M, nenad81, nikolapetkovic, oddsock, pedja.st, RJ, royst33, Sale.S, sizif, spektorsky, Srki94, ssekir75, Stanlio, StepskiVuk, Toni, vilotic, VP3987, wolverined4