5.3.7 Une dernière modification

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.