Dies hat wahrscheinlich mit Konflikten in Ihrem L2-Cache zu tun.
Cache-Fehler auf matice1 sind nicht das Problem, da auf sie nacheinander zugegriffen wird. Wenn jedoch für matice2 eine vollständige Spalte in L2 passt (dh wenn Sie auf matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] usw. zugreifen, wird nichts entfernt), gibt es kein Problem mit Cache fehlt auch mit matice2.
Um nun genauer zu untersuchen, wie Caches funktionieren, wenn die Byteadresse Ihrer Variablen X ist, lautet die Cache-Zeile dafür (X >> 6) & (L - 1). Dabei ist L die Gesamtzahl der Cache-Zeilen in Ihrem Cache. L ist immer eine Potenz von 2. Die sechs ergibt sich aus der Tatsache, dass 2 ^ 6 == 64 Bytes die Standardgröße der Cache-Zeile sind.
Was bedeutet das nun? Nun, es bedeutet, dass wenn ich Adresse X und Adresse Y habe und (X >> 6) - (Y >> 6) durch L teilbar ist (dh eine große Potenz von 2), sie in derselben Cacheline gespeichert werden.
Um nun auf Ihr Problem zurückzukommen: Was ist der Unterschied zwischen 2048 und 2049?
wenn 2048 deine Größe ist:
Wenn Sie & matice2 [x, k] und & matice2 [y, k] nehmen, ist die Differenz (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) durch 2048 * 4 (Größe) teilbar von float). Also eine große Potenz von 2.
Abhängig von der Größe Ihres L2 treten daher viele Cache-Zeilen-Konflikte auf, und Sie verwenden nur einen kleinen Teil Ihres L2 zum Speichern einer Spalte. Daher können Sie nicht die gesamte Spalte in Ihrem Cache speichern, sodass Sie eine schlechte Leistung erzielen .
Wenn die Größe 2049 ist, beträgt der Unterschied 2049 * 4, was keine Zweierpotenz ist. Sie haben also weniger Konflikte und Ihre Spalte passt sicher in Ihren Cache.
Um diese Theorie zu testen, können Sie einige Dinge tun:
Ordnen Sie Ihr Array matice2 Array wie dieses matice2 [razmor, 4096] zu und führen Sie es mit razmor = 1024, 1025 oder einer beliebigen Größe aus. Sie sollten im Vergleich zu zuvor eine sehr schlechte Leistung sehen. Dies liegt daran, dass Sie alle Spalten zwangsweise so ausrichten, dass sie miteinander in Konflikt stehen.
Versuchen Sie dann matice2 [razmor, 4097] und führen Sie es mit einer beliebigen Größe aus, und Sie sollten eine viel bessere Leistung sehen.