Il nous reste une dernière chose à modifier dans la fonction sgemmOptimVectorize.
La fonction ressemble à ça :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
void sgemmOptimVectorize(float* __restrict__ pr, const float* __restrict__ pa, const float* __restrict__ pb, size_t size){
float* r = (float*)__builtin_assume_aligned(pr, 16);
float* a = (float*)__builtin_assume_aligned(pa, 16);
float* b = (float*)__builtin_assume_aligned(pb, 16);
size_t i,j,k;
for(i = 0; i < size*size; ++i){
r[i] = 0.0f;
}
size_t jSize,kSize;
for(j = 0; j < size; ++j){
jSize = j*size;
for(k = 0; k < size; ++k){
kSize = k*size;
for(i = 0; i < size; ++i){
r[jSize + i] += a[jSize + k]*b[kSize + i];
}
}
}
}
|
Il est possible de ne pas relire la valeur de a[jSize + k] à chaque itération sur i car sa valeur ne change pas en fonction de i.
|