2009-11-25 19 views
7

क्या लिनक्स में कोई एसिंक्रोनस मेम्पी फ़ंक्शन है? मैं इसे डीएमए के साथ काम करना चाहता हूं और इसे पूरा होने पर सूचित करता हूं।असीमित memcpy?

+0

क्या मंच? क्या यह x86 है? –

+1

यह एआरएम 9 प्रोसेसर है, फ्रीस्केल iMX233 माइक्रो नियंत्रक। – SunnyShah

उत्तर

7

जहाँ तक मुझे पता है, सीपीयू/डीएमए ही ऐसा नहीं कर सकते नहीं है। इसलिए आपको बस के लिए चाल करने के लिए बस पर एक बाहरी हार्डवेयर की आवश्यकता है।

हालांकि अधिकांश हार्डवेयर सभी भौतिक स्मृति समाधान नहीं कर सकते, तो एक सटीक memcpy क्लोन संभव जब तक आप अपने उपयोग के मामले में स्मृति पता श्रेणी की बहुत सख्त परिभाषाएँ नहीं है। अन्यथा कर्नेल को ब्लॉक को अपने स्वयं के मेमोरी ब्लॉक पर याद रखना होगा जो पहले स्थान पर क्लॉन्किंग क्लोनिंग के उद्देश्य को मार देगा :)

लेकिन फिर भी अगर आप मेमकपी के बिना मेमोरी ब्लॉक का "क्लोन" बनाना चाहते हैं (अभी भी एक बुरा विचार है क्योंकि डीएमए मेमोरी एक्सेस आमतौर पर सीपीयू की तुलना में धीमी है) आप मेमोरी ब्लॉक को वीडियो कार्ड पर भेज सकते हैं और इसे वापस दूसरे बफर पर खींच सकते हैं। आप ब्लॉक को वीडियो मेमोरी (putbitmap()? :) में भी डाल सकते हैं) और फ्लाई पर एक प्रतिलिपि बनाने के लिए हार्डवेयर त्वरित बिटब्लैट() करें।

आप अपने वास्तविक लक्ष्य को बांटने तो शायद लोगों को होशियार/बेहतर चाल के साथ आने कर सकते हैं कोई आपत्ति है?

+0

@ssg, मेरे वास्तविक लक्ष्य अनुकूलित वीडियो प्लेयर बनाने के लिए, यह मैं अपने कतार में मेरी YUV डेटा की प्रतिलिपि है। अब उस प्रतिलिपि में 2 सेकेंड लगते हैं, अगर यह प्रति डीएमए के माध्यम से होती है तो इस समय में एक और थ्रेड में मैं ऑडियो डिकोडिंग कर सकता हूं। – SunnyShah

+3

@ सुनी शाह, आपको साझा स्मृति का उपयोग कर शून्य प्रति समाधान समाधान देखना चाहिए? आप स्मृति के इतने बड़े हिस्सों की प्रतिलिपि क्यों बना रहे हैं? – Dipstick

+1

FFMPEG YUVFrame को डीकोड फ़ंक्शन आउटपुट के रूप में आउटपुट करता है। जब आप अगले YUVFrame चाहते हैं, तो यह नया बनाने के लिए मौजूदा YUVFrame को संपादित करता है। तो मैं क्या करता हूं, मैं YUVFrame को बफर की कतार में कॉपी करता हूं और समय आने पर कतार से फ्रेम दिखाता हूं। यह प्रति प्रोसेसिंग समय के लगभग 7% लेता है। – SunnyShah

3

एक मल्टीकोर प्रोसेसर या यहां तक ​​कि केवल hyper-threading के साथ एक प्रोसेसर पर, आप एक अलग थ्रेड में सामान्य (सिंक्रोनस) memcpy निष्पादित करके जो चाहते हैं उसे प्राप्त कर सकते हैं। मैं यह नहीं कह रहा हूं कि यह एक अच्छा विचार है, बस स्पष्ट बता रहा है।

1

आप mremap के साथ कुछ नाटकों कर सकते हैं। या आप विभिन्न फ्रेम के लिए अलग-अलग बफर का उपयोग करने के लिए FFmpeg को हैक कर सकते हैं।

संबंधित मुद्दे