Мне поручено оптимизировать умножение матриц на одном процессоре.Я пытался написать код для эффективной работы с блоками (мозаика), но все еще вижу плохие результаты.Любые предложения?
int min(int a, int b) {
return a < b ? a : b;
}
void square_gemm(int n, double* A, double *B, double *C) {
const int blockSize = 32;
for (int a = 0; a < n; a += blockSize) {
for (int b = 0; b < n; b += blockSize) {
double* loc = C + a + b*n;
for (int c = b; c < min(b + blockSize, n); c++) {
loc = C + c * n+a;
for (int d = a; d < min(a + blockSize, n); d++) {
double v = *loc;
double* x = A + d;
double* y = B + c*n;
for (int z = 0; z < n; z++) {
v += *x * *y;
x +=n;
y++;
}
*loc = v;
loc++;
}
}
}
}
}
Размер: 31 Мфлоп / с: 2538,2 Процент: 5,92 Размер: 32 Мфлоп / с: 2552,5 Процент: 5,95 Размер: 96 Мфлоп / с: 2423,72 Процент: 5,65 Размер: 97 Мфлоп /s: 2403,63 Процент: 5,60 Размер: 127 Мфлоп / с: 2369,64 Процент: 5,52 Размер: 128 Мфлоп / с: 2306,98 Процент: 5,38 Размер: 129 Мфлоп / с: 2354,48 Процент: 5,49 Размер: 191 Мфлоп / с: 2256,07 Процент: 5,26Размер: 192 Mflop / s: 2164.02 Процент: 5.04 Размер: 229 Mflop / s: 2218.75 Процент: 5.17 Размер: 255 Mflop / s: 2200.95 Процент: 5.13 Размер: 256 Mflop / s: 1004.8 Процент: 2.34 Размер: 257 Mflop / s: 2204.24 Процент: 5.14 Размер: 319 Mflop / s: 2194.66 Процент: 5.12 Размер: 320 Mflop / s: 1941.34 Процент: 4.53 Размер: 321 Mflop / s: 2182.21 Процент: 5.09 Размер: 417 Mflop / s: 2126.13 Процент: 4.96 Размер: 479 Mflop / s: 2043.11 Процент: 4.76 Размер: 480 Mflop / s: 1885.02 Процент: 4.39 Размер: 511 Mflop / s: 2060.33 Процент: 4.80 Размер: 512 Mflop / s: 978.162 Процент: 2.28 Размер: 639 Mflop / s:1883,58 процент: 4,39 SizE: 640 Mflop / s: 990,688 Процент: 2,31 Размер: 767 Mflop / s: 1834,17 Процент: 4,28 Размер: 768 Mflop / s: 991,239 Процент: 2,31 Размер: 769 Mflop / s: 1827,9 Процент: 4,26 Средний процент Пика = 4,66531Оценка = 6,98447
Матрицы в порядке столбцов между прочим.