Я хочу оптимизировать свой код с помощью цикла разворачивания. Я попытался применить разворот, но я думаю, что не могу этого сделать, и я не вижу своей проблемы. Я хочу применить цикл развертывания к внешнему циклу.Вложенная Loop Unrolling in C
Эти петли переносят матрицу.
Это мой цикл, чтобы применить разворачивая цикл:
void transpose(int dim, int *src, int *dst) {
for (i = 0; i < dim; i++)
for (j = 0; j < dim; j++)
dst[j * dim + i] = src[i * dim + j];
}
Это мой разворачивания цикл:
void transpose(int dim, int *src, int *dst) {
int i = 0, j = 0, dimi = 0, dimj = 0, tempi = 0;
for (i = 0; i < dim; i += 8) {
for (j = 0; j < dim; j++) {
dimj = j * dim + i;
dimi = i * dim + j;
dst[dimj] = src[dimi];
tempi = i + 1;
if (tempi < dim) {
dimj = j * dim + tempi;
dimi = tempi * dim + j;
dst[dimj] = src[dimi];
tempi += 1;
if (tempi < dim) {
dimj = j * dim + tempi;
dimi = tempi * dim + j;
dst[dimj] = src[dimi];
tempi += 1;
if (tempi < dim) {
dimj = j * dim + tempi;
dimi = tempi * dim + j;
dst[dimj] = src[dimi];
tempi += 1;
if (tempi < dim) {
dimj = j * dim + tempi;
dimi = tempi * dim + j;
dst[dimj] = src[dimi];
tempi += 1;
if (tempi < dim) {
dimj = j * dim + tempi;
dimi = tempi * dim + j;
dst[dimj] = src[dimi];
tempi += 1;
if (tempi < dim) {
dimj = j * dim + tempi;
dimi = tempi * dim + j;
dst[dimj] = src[dimi];
tempi += 1;
if (tempi < dim) {
dimj = j * dim + tempi;
dimi = tempi * dim + j;
dst[dimj] = src[dimi];
}
}
}
}
}
}
}
}
}
}
Развертывание петли как оптимизация лучше всего оставить компиляторам. – Chad
Loop unrolling - это работа для компилятора, пусть это сделает это за вас. – rom1v
Компилятор может видеть, есть ли у этого другие побочные эффекты, такие как худший кэш. Учитываете ли вы это? – usr2564301