Sie können die Anzahl der Iterationen halbieren durch zu bemerken, daß der Betrieb symmetrisch ist:
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];
}
}
}
EDIT : Wenn der häufigste Wert 8 ist, versuchen Sie den folgenden Code mit -O3
. Der Compiler sollte aus dem gleichen Quellcode effizienten Code für den Sonderfall generieren können.
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];
}
}
}
}
Wenn die Leistungsverbesserung nicht signifikant ist, können Sie die Schleifen von Hand auf eine Folge von 36 Aussagen entrollen. Das Umordnen dieser Anweisungen kann zu zusätzlichen Verbesserungen für ausgewählte Architekturen und zu langsameren Operationen für andere führen.
ich Sie für die Geschwindigkeit optimieren erraten wollen ... Nun, wäre eine Sache zu stoppen sein i, indem die Berechnung in die jedes Mal in der inneren Schleife dim * Berechnung äußere Schleife und Zuweisen des Werts zu der Variablen, die innerhalb der inneren Schleife verwendet wird. – ZenJ
Wissen Sie, was der häufigste Wert von "Dim" ist? – chqrlie