Esiste una funzione memcpy asincrona in linux? Voglio che funzioni con DMA e avvisami quando viene completato.memcpy asincrono in linux?
risposta
Per quanto ne so, non CPU/non può fare DMA a se stesso. Quindi hai bisogno di un hardware esterno sul bus per fare il trucco per te.
Tuttavia la maggior parte hardware non può indirizzare tutta la memoria fisica, quindi un clone esatto memcpy non è possibile se non si hanno definizioni molto rigorosi su intervalli di indirizzi di memoria nel caso d'uso. Altrimenti il kernel dovrebbe memcpare il blocco al proprio blocco di memoria stesso che ucciderebbe lo scopo della clonazione memcpy in primo luogo :)
Ma ancora se si vuole creare un "clone" di un blocco di memoria senza usare memcpy (ancora una cattiva idea, a proposito perché l'accesso alla memoria DMA è di solito più lento di quello della CPU) è possibile inviare il blocco di memoria alla scheda video e rimetterlo in un altro buffer. Potresti anche essere in grado di inserire il blocco nella memoria video (putbitmap()? :)) e fare un bitblt() accelerato dall'hardware per creare una copia al volo.
ti dispiace condividere il vostro obiettivo reale così forse la gente può venire con più intelligenti/trucchi migliori?
@ssg, Il mio vero obiettivo è quello di creare video player ottimizzato, In esso copio i miei dati YUV alla sua coda. Ora quella copia impiega 2 secondi, Se questa copia avviene tramite DMA piuttosto che In questo momento In un'altra discussione posso eseguire la decodifica audio. – SunnyShah
@Sunny Shah, dovresti guardare una soluzione a zero copie magari usando la memoria condivisa? Perché copi così tanti pezzi di memoria? – Dipstick
FFMPEG emette YUVFrame come uscita della funzione di decodifica. quando vuoi il prossimo YUVFrame, modifica solo YUVFrame esistente per crearne di nuovi. Quindi, quello che faccio è, copio YUVFrame in coda di buffer e mostrerò il frame dalla coda quando sarà il momento. Questa copia richiede circa il 7% del tempo di elaborazione. – SunnyShah
Su un processore multicore o anche solo su un processore con hyper-threading, è possibile eseguire l'ordinario (in modo sincrono) memcpy
in un thread separato. Non sto dicendo che sia una buona idea, solo sottolineando l'ovvio.
Si può fare qualche gioca con mremap. Oppure puoi hackerare FFmpeg per usare diversi buffer per diversi frame.
- 1. Posso fare una memcpy copy-on-write in Linux?
- 2. Driver di dispositivo Linux: simbolo "memcpy" non trovato
- 3. memcpy ottimizzato
- 4. Bzero() e bcopy() contro memset() e memcpy()
- 5. C memcpy al contrario
- 6. Memcpy() nella programmazione sicura?
- 7. evitano con memcpy
- 8. copy_to_user vs memcpy
- 9. Scarse prestazioni memcpy nello spazio utente per la memoria fisica di mmap in Linux
- 10. strcpy vs. memcpy
- 11. come memcpy l'array bidimensionale in C?
- 12. Esiste un equivalente a memcpy() in Java?
- 13. Utilizzo asincrono in metodo non asincrono
- 14. Delphi CopyMemory vs C++ memcpy
- 15. std :: copy/memcpy/memmove ottimizzazioni
- 16. Differenza tra strncpy e memcpy?
- 17. può memcpy per std :: aligned_storage?
- 18. regole C aliasing e memcpy
- 19. IO asincrono in Java?
- 20. Calcolo asincrono in TensorFlow
- 21. Modificatore asincrono in C#
- 22. è possibile fare memcpy in bit invece che in byte?
- 23. Capire la copia eseguita da memcpy()
- 24. Esiste una versione standard, striata di memcpy?
- 25. Come funziona l'implementazione interna di memcpy?
- 26. Perché la memcpy/memset è complessa?
- 27. Come evitare l'overflow del buffer memcpy?
- 28. C++ memcpy to char * da c_str
- 29. Che cos'è "naturalmente asincrono" o "puro asincrono"?
- 30. troppo pochi argomenti per funzione 'memcpy'
Quale piattaforma? È questo x86? –
E 'un processore ARM9, un microcontrollore Freescale iMX233. – SunnyShah