Salve, devo convertire questa funzione in c in assembly:
#define MATRIX float*
MATRIX prodMatrixRowCacheUnroll(MATRIX A, MATRIX B, int righeA, int colonneB, int RC, int block_size){
MATRIX Prod = alloc_matrix(righeA,colonneB);
int i,j,k,ii,jj,kk;
int unroll=10;
for (i=0;i<righeA;i+=block_size) {
for (j=0;j<colonneB;j+=block_size) {
for(k=0;k<RC;k+=block_size){
for (ii=i; ii<i+block_size; ii++) {
for (jj=j; jj<j+block_size; jj++){
for (kk=k; kk<k+block_size; kk+=unroll) {
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+kk]*B[(kk*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+1)]*B[((kk+1)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+2)]*B[((kk+2)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+3)]*B[((kk+3)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+4)]*B[((kk+4)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+5)]*B[((kk+5)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+6)]*B[((kk+6)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+7)]*B[((kk+7)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+8)]*B[((kk+8)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+9)]*B[((kk+9)*colonneB)+jj];
}
}
}
}
}
}
return Prod;
}
è un prodotto di matrici, dove A è la trasposta di B, con tecniche di unrolling e cache blocking, sono nuovo di assembly nasm, e ho cominciato a scrivere questa funzione:
%include "sseutils.nasm"
section .data
section .bss
section .text
global main
A equ 8
beta equ 12
m equ 16 ; righe matrice
n equ 20 ; colonne matrice
main:
push ebp ; salva il Base Pointer
mov ebp, esp ; il Base Pointer punta al Record di Attivazione corrente
push ebx ; salva i registri da preservare
push esi
push edi
mov eax, [ebp+A] ; indirizzo della MATRIX A
mov ebx, [ebp+beta] ; indirizzo di beta
mov ecx, [ebp+m] ; numero m righe
mov edx, [ebp+n] ; numero n colonne
call prodMatrixRowCacheUnroll
il punto è che siccome devo farla con la architettura X86, come memorizzo tutte le variabili i,ii,j,jj,block_size, k e kk? non mi bastano i registri, forse sarà una domanda banale, ma sono nuovo e non so come fare, devo tradurre questa funzione e sono in difficoltà..grazie