Вы можете вдвое сократить число итераций заметив, что операция является симметричным:
void naive_col_convert(int dim, int *G) {
for (int i = 0; i < dim; i++) {
G[i * dim + i] = G[i * dim + i] != 0;
for (int j = i + 1; j < dim; j++) {
G[i * dim + j] = G[j * dim + i] = G[j * dim + i] || G[i * dim + j];
}
}
}
РЕДАКТИРОВАТЬ :, если наиболее распространенное значение равно 8, попробуйте код ниже с -O3
. Компилятор должен иметь возможность генерировать эффективный код для специального случая из того же исходного кода.
void naive_col_convert(int dim, int *G) {
if (dim == 8) {
#define dim 8
for (int i = 0; i < dim; i++) {
G[i * dim + i] = G[i * dim + i] != 0;
for (int j = i + 1; j < dim; j++) {
G[i * dim + j] = G[j * dim + i] = G[j * dim + i] || G[i * dim + j];
}
}
#undef dim
} else {
for (int i = 0; i < dim; i++) {
G[i * dim + i] = G[i * dim + i] != 0;
for (int j = i + 1; j < dim; j++) {
G[i * dim + j] = G[j * dim + i] = G[j * dim + i] || G[i * dim + j];
}
}
}
}
Если улучшение производительности не имеет существенного значения, вы можете раскатать петли вручную на последовательность из 36 утверждений. Переупорядочение этих операторов может привести к дополнительным улучшениям для выбранных архитектур и более медленной работе с другими.
Я предполагаю, что вы хотите, чтобы оптимизировать скорость ... Ну, одна вещь должна была бы остановить вычисления я * тусклым каждый раз, когда внутри внутреннего цикла, принимая расчет в внешний цикл и присвоение значения переменной, которая будет использоваться во внутреннем цикле. – ZenJ
Вы знаете, что является наиболее распространенным значением 'dim'? – chqrlie