2013-01-15 13 views
52

के तहत CGEventPost का कमजोर प्रदर्शन हमने क्वार्ट्ज घटनाओं के साथ एक प्रदर्शन समस्या पर ठोकर खाई है, अधिक विशेष रूप से CGEventPost: भारी GPU लोड CGEventPost के दौरान ब्लॉक कर सकते हैं। हमने a small benchmark application to demonstrate the issue बनाया है। यह एप्लिकेशन केवल एक लूप है जो ईवेंट बनाता है, पोस्ट करता है और रिलीज़ करता है।GPU लोड

नीचे आप एप्लिकेशन चलाने के परिणाम देख सकते हैं। पहला रन निष्क्रिय प्रणाली पर है। दूसरा रन फुरमार्क (जीपीयू तनाव परीक्षण) के साथ डायल के साथ जितना संभव हो उतना क्रैंक किया गया है।

  • इनर कब तक भीतरी पाश, लेता है मूल रूप से बस, बनाने पोस्टिंग और क्वार्ट्ज घटनाक्रम के साथ एक घटना को रिहा है।
  • बाहरी यह है कि हमारा कार्यक्रम कितने समय तक जागने का इंतजार कर रहा है (नींद)। हमारे सोने के समय के करीब होना चाहिए, लेकिन यदि सिस्टम दबाव में है तो इसमें देरी हो सकती है।
  • पोस्ट यह है कि ईवेंट पोस्ट कितनी देर तक लेता है।

 

18:58:01.683 EventPerformance[4946:707] Measurements: (outer should be close to 10) 
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03 
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03 
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.26, CGEventPost (ms): 0.03 
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.06, outer (ms): 10.85, CGEventPost (ms): 0.05 
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.41, CGEventPost (ms): 0.04 
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 10.39, CGEventPost (ms): 0.03 
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.05, outer (ms): 11.02, CGEventPost (ms): 0.03 
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.03, outer (ms): 10.67, CGEventPost (ms): 0.03 
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.08, outer (ms): 10.09, CGEventPost (ms): 0.05 
18:58:01.688 EventPerformance[4946:707] Averages: (outer should be close to 10) 
18:58:01.688 EventPerformance[4946:707] avg inner (ms): 0.05, avg outer (ms): 10.64, avg post (ms): 0.03 

यहाँ हम देख सकते हैं कि घटना पोस्टिंग औसतन 0.03 के बारे में एमएस लेता है। ऐसा लगता है कि धागा बहुत देर तक लगभग 0.5 मिमी तक जागृत हो रहा है। CGEventPost में कोई स्पाइक्स नहीं।

19:02:02.150 EventPerformance[5241:707] Measurements: (outer should be close to 10) 
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.23, CGEventPost (ms): 0.02 
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.54, CGEventPost (ms): 0.02 
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 11.01, CGEventPost (ms): 0.01 
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.74, CGEventPost (ms): 0.01 
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.20, CGEventPost (ms): 0.01 
19:02:02.152 EventPerformance[5241:707] inner (ms): 10.35, outer (ms): 11.01, CGEventPost (ms): 10.35 
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.02, CGEventPost (ms): 0.02 
19:02:02.153 EventPerformance[5241:707] inner (ms): 58.90, outer (ms): 10.11, CGEventPost (ms): 58.90 
19:02:02.153 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.12, CGEventPost (ms): 0.02 
19:02:02.153 EventPerformance[5241:707] Averages: (outer should be close to 10) 
19:02:02.371 EventPerformance[5241:707] avg inner (ms): 7.71, avg outer (ms): 10.44, avg post (ms): 7.71 

प्रणाली भारी GPU लोड किया जा रहा है जब, एक घटना पोस्टिंग (spikes) माइक्रोसेकंड की बजाय मिलीसेकेंड ले सकते हैं। चरम जीपीयू तनाव के तहत (< 1 एफपीएस), इस मान में सेकंड लग सकते हैं। CGEventPost कभी-कभी GPU को लौटने से पहले कुछ काम खत्म करने का इंतजार कर रहा है। हमारा धागा अभी भी सामान्य रूप से कोई ध्यान देने योग्य देरी/स्पाइक्स (बाहरी) के साथ निर्धारित नहीं है।

किसी भी विचार की सराहना की जाती है।

+2

ओपनसीएल काम की भारी मात्रा में जमा करते समय मुझे विंडोज़ में भी बुरा प्रभाव दिखाई देता है (मुझे पता है कि आप ओएसएक्स पर हैं): सभी जीपीयू ड्राइंग एक क्रॉल में धीमा हो जाती है। ऐसा लगता है कि जीपीयू के पास प्राथमिकता की कोई अवधारणा नहीं है या वेवफ़्रंट कितना पुराना है। – doug65536

+2

यह देखने के लिए कि मंदी कहाँ हो रही है, उपकरण के साथ प्रोफाइलिंग करने का प्रयास करें। – monoxygen

+1

आपके द्वारा चलाए गए कंप्यूटर में किस प्रकार का ग्राफिक्स कार्ड है? एकीकृत, एकीकृत + अलग, या अलग? यह देखना दिलचस्प होगा कि क्या आपको एक अलग ग्राफिक्स कार्ड कॉन्फ़िगरेशन वाले सिस्टम पर चलने वाले विभिन्न व्यवहार मिलते हैं। – monoxygen

उत्तर

5

मुझे लगता है कि आप कतार (अंतर्निहित मच बंदरगाह) को भरने कर रहे हैं ...

आप इस का उपयोग करते हुए "शेड्यूलिंग" या उपकरण में "सिस्टम कॉल" साधन पुष्टि कर सकते हैं। (एक नया रिक्त दस्तावेज़ बनाएं, उपकरण जोड़ें, फिर File > Record Options... के तहत सुनिश्चित करें कि "स्थगित मोड" चेक किया गया है।) यह आपके ऐप में सभी थ्रेड गतिविधि दिखाएगा (जब थ्रेड ब्लॉक, जब वे सोते हैं, जब वे सक्रिय होते हैं, और क्यों) ।

मैं पहले थ्रेड कॉलिंग CGEventPost पर थ्रेड प्राथमिकता (सीएफ man 3 PTHREAD_SCHEDPARAM) को बढ़ाने का प्रयास करता हूं। यदि आपका धागा निचले प्राथमिकता धागे पर अवरुद्ध है, तो कर्नेल को अस्थायी रूप से अवरोधक थ्रेड की प्राथमिकता को प्राथमिकता से बचने और अपने कार्य को पहले पूरा करने में मदद करने के लिए अस्थायी रूप से बढ़ा देना चाहिए।

कुल मिलाकर मुझे लगता है कि आप के रूप में नीचे, एक 2-धागा समाधान लागू करना होगा:

घटनाओं आप पोस्ट करना चाहते के लिए एक कतार बनाएँ। अपने मुख्य धागे (या घटना पोस्टिंग थ्रेड) से इस कतार में ईवेंट पोस्ट करें, फिर कतार चलने के लिए एक दूसरा थ्रेड (एक ईवेंट उपभोक्ता थ्रेड जो आप बनाते हैं) को सिग्नल करें और CGEventPost के साथ किसी भी बकाया ईवेंट पोस्ट करें।

जब CGEventPost ब्लॉक, आपका दूसरा ईवेंट-पोस्टिंग थ्रेड ब्लॉक होगा, लेकिन यह किसी अन्य थ्रेड को अवरुद्ध नहीं करेगा। जब CGEventPost अंततः अनब्लॉक करता है, तो यह आपके ईवेंट उपभोक्ता थ्रेड द्वारा पोस्ट की गई किसी भी उत्कृष्ट घटनाओं का उपभोग करेगा और ईवेंट उपभोक्ता थ्रेड पोस्टिंग ईवेंट फिर से शुरू कर सकता है।

एक और संभावना: क्या आप घटनाओं को जोड़ सकते हैं? कुछ प्रकार की घटनाएं (माउस चालें?) हैं जिन्हें आप कम घटनाओं में जोड़ सकते हैं। आप शायद कभी भी CGEventPost की कतार सीमा में भाग लेंगे, मुझे लगता है कि 2-थ्रेड दृष्टिकोण शायद आपकी सबसे अच्छी शर्त है।

+0

चूंकि मैंने सवाल पूछा है कि हमने CGEventPost से IOHIDPostEvent में स्विच किया है जो GPU लोड के तहत बहुत बेहतर प्रदर्शन करता है, लेकिन फिर भी अन्य स्थितियों में अवरुद्ध करता है। – Dae

+0

उपकरण का उपयोग करके हमने पाया कि आईओएचआईडी और क्वार्ट्ज दोनों के लिए हम mach_msg_trap में अवरुद्ध कर रहे हैं, शायद एक संदेश प्राप्त करने का इंतजार कर रहे हैं। हमने अधिक जानकारी प्राप्त नहीं की है (यानी दूसरी तरफ कौन है, और वह क्यों अवरुद्ध कर रहा है)। – Dae

+0

वास्तविक समय प्राथमिकता के लिए, इसे परीक्षण ऐप से गलती से हटा दिया गया था, लेकिन हमारे पास यह हमारी वास्तविक परियोजना में है। (हालांकि कोई फर्क नहीं पड़ता)। हमने coalescing और थ्रेडिंग लागू किया है - सुझाव के लिए धन्यवाद! – Dae

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

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