2016-07-24 48 views
7

में अवशिष्ट ढेर आवंटन दूर अनुकूलन मैं julia --track-allocation prof.jl निम्नलिखित उत्पादन में जिसके परिणामस्वरूप भाग गया:जूलिया

- using FixedSizeArrays 
    - 
    - immutable KernelVals{T} 
    -  wavenumber::T 
    -  vect::Vec{3,T} 
    -  dist::T 
    -  green::Complex{T} 
    -  gradgreen::Vec{3,Complex{T}} 
    - end 
    - 
    - function kernelvals(k, x, y) 
    -  r = x - y 
    0  R2 = r[1]*r[1] 
    0  R2 += r[2]*r[2] 
    0  R2 += r[3]*r[3] 
    0  R = sqrt(R2) 
    - 
    0  γ = im*k 
    0  expn = exp(-γ * R) 
    0  fctr = 1.0/(4.0*pi*R) 
    0  green = fctr * expn 
    64  gradgreen = -(γ + 1/R) * green/R * r 
    - 
    0  KernelVals(k, r, R, green, gradgreen) 
    - end 
    - 
    - function payload() 
    - x = Vec{3,Float64}(0.47046262275611883,0.8745228524771103,-0.049820876498487966) 
    0 y = Vec{3,Float64}(-0.08977259509004082,0.543199687600189,0.8291184043296924) 
    0 k = 1.0 
    0 kv = kernelvals(k,x,y) 
    - return kv 
    - end 
    - 
    - function driver() 
    - println("Flush result: ", payload()) 
    0 Profile.clear_malloc_data() 
    0 payload() 
    - end 
    - 
    - driver() 

मैं लाइन gradgreen... शुरू करने पर अंतिम स्मृति आवंटन से छुटकारा पाने के लिए नहीं कर सकते हैं। मैं @code_warntype kernelsvals(...) भाग गया, कोई प्रकार अस्थिरता या अनिश्चितता प्रकट नहीं किया।

आवंटन पैटर्न julia-0.4.6 और julia-0.5.0-pre पर समान है।

यह फ़ंक्शन एक सीमा तत्व विधि में आंतरिक कर्नेल होगा जिसे मैं कार्यान्वित कर रहा हूं। इसे सचमुच लाखों बार कहा जाएगा, जिसके परिणामस्वरूप सकल स्मृति आवंटन होता है जो भौतिक स्मृति के एकाधिक होने के लिए उपलब्ध हो सकता है।

कारण मैं FixedSizeArrays का उपयोग कर रहा हूं, छोटे Array एस के निर्माण से संबंधित आवंटन से बचने के लिए है।

सटीक स्थान जहां आवंटन की सूचना दी गई है, कोड पर एक बहुत ही संवेदनशील तरीके से निर्भर करता है। किसी बिंदु पर स्मृति प्रोफाइलर 1/(4*pi*R) को आवंटित करने वाली रेखा के रूप में दोषी ठहरा रहा था।

अनुमानित आवंटन पैटर्न के परिणामस्वरूप कोड लिखने के बारे में कोई भी मदद या सामान्य युक्तियों की अत्यधिक सराहना की जाती है।

उत्तर

3

कुछ प्रयोगों के बाद मैं अंततः सभी आवंटन से छुटकारा पाने में कामयाब रहा। अपराधी FixedSizeArrays में विस्तारित पदोन्नति वास्तुकला के रूप में सामने आया। स्पष्ट रूप से जटिल स्केलर और एक वास्तविक वेक्टर गुणा करने से रास्ते में एक अस्थायी बनाता है।

साथ

c = -(γ + 1/R) * green/R 
gradgreen = Vec(c*r[1], c*r[2], c*r[3]) 

परिणाम आवंटन से मुक्त रन में gradgreen की परिभाषा की जगह। मेरे बेंचमार्क उदाहरण में निष्पादन समय 6.5 सेकंड से 4.15 सेकेंड तक नीचे आया। कुल आवंटन आकार 4.5 जीबी से 1.4 जीबी तक।

ईडीटी: इस समस्या को FixedSizeArrays डेवलपर्स को रिपोर्ट किया गया, जिन्होंने तुरंत इसे ठीक किया (धन्यवाद!)। आवंटन पूरी तरह से गायब हो गया।

+0

इसे समझने के लिए स्लेथिंग पर अच्छा काम, एक व्यक्तिगत समाधान विकसित करना, और फिर इसे वैश्वीकृत करना! –