6

मैं गणित मॉड्यूल संकलित करना चाहता हूं क्योंकि मैं गति के बाद हूं।गणित - बिटशफ्ट राइट (या बाएं) को कैसे संकलित करें?

testC = Compile[{{inputInt, _Integer}}, 
     Module[{outputInt, bitShift = 5}, 
     outputInt = BitShiftRight[inputInt, bitShift] 
     ] 
     , CompilationTarget -> "C", RuntimeOptions -> "Speed" 
     , CompilationOptions -> {"ExpressionOptimization" -> True, 
     "InlineCompiledFunctions" -> True, 
     "InlineExternalDefinitions" -> True} 
    ]; 

मेरे असली समारोह लंबे समय तक है, लेकिन एक बहुत ही सरल संरचना है, सूचियों का उपयोग करता है, और केवल निम्नलिखित समारोह में शामिल है:, कुल, टेबल, BitAnd हैं। मेरे संकलन में सभी संकलन और रनटाइम विकल्प उपयोगी (शायद) उपयोगी हैं, न कि यह एक लाइन निकालें।

मैं

SetSystemOptions [-> "CompileReportExternal" - "CompileOptions"> यह सच है] की स्थापना की है;

यकीन है कि मैं देख सकता हूँ कि क्या होता है बनाने के लिए, और

CompilePrint [testC]

निम्न परिणाम

1 argument 
    3 Integer registers 
Underflow checking off 
Overflow checking off 
Integer overflow checking off 
RuntimeAttributes -> {} 

    I0 = A1 
    I1 = 5 
    Result = I2 

    1 I2 = MainEvaluate[ Hold[BitShiftRight][ I0, I1]] 
    2 Return 

जैसी उम्मीद थी/इस धागे से डरते थे देता है https://mathematica.stackexchange.com/a/1101/1403 बिटशफ्ट राइट संकलित नहीं है, और मेनएवलुएट को यह कॉल मेरे Funct पर एक गंभीर ड्रैग है आयन। मैं बेहद आश्चर्यचकित हूं कि इस तरह का बहुत कम स्तर, सामान्य कार्य संकलित नहीं है जबकि बिट एंड, बिटनॉट, बिटोर, बिटक्सर हैं! क्या किसी को एक (तेज़) कामकाज के बारे में पता है? मैं एक सी भाषा फ़ंक्शन में मैथलिंक कॉल का उपयोग कर सकता हूं, लेकिन मेरा उद्देश्य इस फ़ंक्शन को मैनिपुलेट [] में उपयोग करना है और इसे अकेले स्टैंड सीडीएफ फ़ाइल के रूप में तैनात करना है। और मैं समझता हूं कि इस संदर्भ में मैं मैथलिंक का उपयोग नहीं कर सकता, सही? वैसे, क्या वहां कुछ ट्रैक्टेबल वर्कअराउंड है?

उत्तर

3

यदि आप 32 से विभाजित करते हैं, तो संकलक शायद इसे एक शिफ्ट के रूप में फिर से लिख देगा। आपको सीधे गणित में 32 तक विभाजित करने का प्रयास करना चाहिए, यह सुनिश्चित करना कि आपका डेटा पैक है और पैक किया गया है (डेवलपर 'टूपेकएड्रे [])। डेटा को पीछे और आगे भेजने का ओवरहेड शायद सी

+0

में कंप्यूटिंग के लाभ के लायक नहीं होगा, यदि आप कोटिएंट का उपयोग करते हैं तो यह सैन्स बाहरी मूल्यांकनकर्ता कॉल संकलित करेगा। सरल उदाहरण में, उपयुक्त लाइन outputInt = Quotient [inputInt, 2^bitShift]] होगी। यदि आपकी शिफ्ट लंबाई निश्चित स्थिर है, तो बिजली को संकलन समय पर किया जाना चाहिए (शायद आप दोनों जानते थे कि ...)। –

+0

@ Daniel: आपका समाधान मेरे पीबी हल करता है। धन्यवाद! फिर संकलित कोड 'I3 = कोटिएंट [I0, I2]' है। अगर मैं सिर्फ 2^5 से विभाजित हूं, तो मुझे इसे एक इंटीजर में डालने के परिणामस्वरूप गोल करना होगा []। फिर संकलन कोड 'आर 1 = पारस्परिक [आर 0] ' 'R0 = I0'' R0 = R0 * R1' 'I3 = Round [R0]' (लंबा, कम कुशल) है। – Oscar6E