for-schleife mit memcpy / memset ersetzen
-
Hallo,
durch welchen Ausdruck kann ich diese etwas langsame for-Schleife ersetzen, damit das Prog schneller durchlaufen wird?
#define BUF(x) *(unsigned short *)(0x20000000 + x ) for (i = 0; i < (320 * 240); i += 2){ BUF(i) = temp16; }
mit
memcpy(BUF(0), temp16, (320 * 240));
klappt es leider nicht...
gruß
HansImGlück
-
^^dreh die speed-optimierung deines compilers voll auf und schau dir den assembler-output an.
-
Hans Im Glück schrieb:
mit
memcpy(BUF(0), temp16, (320 * 240));
klappt es leider nicht...
gehts ein bisschen genauer? was klappt nicht?
versuchs mal mitmemcpy(BUF(0), temp16, (320 * 240) * sizeof(unsigned short));
-
der Ausdruck mit memcpy ersetzt nicht den Ausdruck mit der for-Schleife.
#define BUF(x) *(unsigned short *)(0x20000000 + x ) for (i = 0; i < (320 * 240); i += 2){ BUF(i) = temp16; }
Vielleicht muss das mit dem i +=2 noch mit eingearbeitet werden (bei memcpy)
Gruß
Hans
-
Hans Im Glück schrieb:
durch welchen Ausdruck kann ich diese etwas langsame for-Schleife ersetzen, damit das Prog schneller durchlaufen wird?
das geht eher nicht.
aber wie stehts mit dem versuch, die schleife nur hundertmal pro sekunde aufzurufen?
-
Hans Im Glück schrieb:
der Ausdruck mit memcpy ersetzt nicht den Ausdruck mit der for-Schleife.
weil temp16 kein array ist, ne?
vielleicht könnteste ein array aus konstanten machen und das dann mit 'memcpy' rüberkopieren? (wobei der datentyp die volle breite des datenbusses haben sollte, also int32_t bei 'ner 32-bit maschine) memcpy ist normalerweise eine schnellere speicherschaufel, als 'ne selbstprogrammierte schleife.
-
äh da fällt mir auf: wieso überhaupt memcpy? wenn schon, dann memset. wobei die allerdings nur mit unsigned chars füllt - welchen typ temp16 hat, kann man ja nur raten.
-
temp16 ist vom Typ unsigned short; ein möglicher Wert für temp16 ist z.B. 0xF100
Gruß
Hans
-
Hans Im Glück schrieb:
temp16 ist vom Typ unsigned short; ein möglicher Wert für temp16 ist z.B. 0xF100
dann probier doch mal ein array aus 76800 hintereinanderliegenden 0xf100 oder, wenn du einen 32-bit prozessor hast, aus 38400 mal 0xf100f100, mit memcpy rüberzuschaufeln. das könnte vielleicht schneller sein.
-
+fricky schrieb:
das könnte vielleicht schneller sein.
vielleicht - wenn temp16 eine konstante ist. der name lässt aber nicht unbedingt darauf schließen.
-
unsigned int BUF=(unsigned int *)(0x20000000); unsigned int temp32=((unsigned int)temp16<<16)|temp16; for (i = 0; i < (320 * 240 / 4); ++i ){ BUF[i] = temp32; }
-
volkard schrieb:
(320 * 240 / 4)
wohl eher
(320 * 240 / 2)
-
+fricky schrieb:
volkard schrieb:
(320 * 240 / 4)
wohl eher
(320 * 240 / 2)
ach ne, doch nicht.
-
+fricky schrieb:
+fricky schrieb:
volkard schrieb:
(320 * 240 / 4)
wohl eher
(320 * 240 / 2)
ach ne, doch nicht.
doch.
-
+fricky schrieb:
+fricky schrieb:
+fricky schrieb:
volkard schrieb:
(320 * 240 / 4)
wohl eher
(320 * 240 / 2)
ach ne, doch nicht.
doch.
nö, doch nicht. sorry.
-
#define BUF(x) *(unsigned short *)(0x20000000 + x )
wie stellt man denn sicher, das es ein array an der adresse 0x20000000 gibt?
was mir noch auffällt, das sich der temp16 wert innerhalb der for-schleife scheinbar nicht ändert. da wäre memset der richtige kandidat, indem man temp16 nach unsigned int verdoppelt.
-
I schrieb:
#define BUF(x) *(unsigned short *)(0x20000000 + x )
wie stellt man denn sicher, das es ein array an der adresse 0x20000000 gibt?
macht die hardware, da ist der bildschirmspeicher eingebaut.
I schrieb:
was mir noch auffällt, das sich der temp16 wert innerhalb der for-schleife scheinbar nicht ändert. da wäre memset der richtige kandidat, indem man temp16 nach unsigned int verdoppelt.
memset kann ein int-array mit einem sich wiederholenden int füllen, dessen vier bytes nicht alle gleich sind? komisch. nee.
-
stimmt geht nicht, shit. memset hackt das int argument auf ein byte ab.