Ich "möchte" (ich bin mir sicher das eigentlich nicht zu wollen und
suche nach einer vernünftigen Lösung) in C ein grosses Array verwenden
(z.B. um Messdaten abzuspeichern, momentan gehts aber eher ums Prinzip).
Die Plattform ist ein Zynq mit insgesamt 1 GB RAM. In einem naiven
Ansatz habe ich nun einfach ein grosses Array definiert:
1 | uint32_t TestArray[125000000];
|
Da ein unit32_t 4 bytes benötigt belegt das Array also gut 500 MB (den
halben Speicher).
Eigentlich hätte ich erwartet, dass der Compiler (bzw. Linker) sich
beschwert, aber er frisst das ganze ohne Probleme.
Als nächsten Schritt habe ich eine Schleife geschrieben die das Array
mit unnützen Daten beschreibt, zudem gibt die Schleife für jeden
Millionsten Eintrag eine Meldung aus damit ich ein Gefühl für die
benötigte Zeit bekommen. Dabei viel mir auf:
- für die ersten 40 Blöcke (à 1e6 uint32_t Werte, also 4e6 bytes)
benötigt das Programm pro Block ca. eine Sekunde.
- Von da an wird die Zeit massiv länger, ein Block benötigt dann etwa 10
Sekunden
Die Frage die sich mir nun stellt:
- Wo wird das Array abgespeichert? Ich dachte Arrays laden auf dem
Stack, das erscheint mir bei der Grösse aber wenig realistisch, zudem
ist der Stack laut Linker Script nur 64 kB gross
- Woher kommt die massiv länger Schreibzeit ab Block 40? Der Zynq hat
256 kB internen Speicher, das reicht aber nicht ansatzweise für 40
Blöcke. Der L2 Chache ist mit 512 kB auch nicht gross genug um irgendwas
in der Grössenordnung zu halten.
- Wie macht man so etwas richtig? Die Idee, ein Riesenarray zu
definieren erscheint mir nicht wirklich sinnvoll, ehrlicherweise fällt
mir allerdings nichts besseres ein. Es geht eigentlich darum,
Referenzwerte zu generieren die dann per DMA vom FPGA Teil aus dem
Speicher gelesen werden. Die Samplerate ist dabei allerdings zwischen 10
MHz und 50 MHz auf mehreren Kanälen, eine Online-Generierung per CPU
geht sich also zeitlich niemals aus.