में अवशिष्ट ढेर आवंटन दूर अनुकूलन मैं 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)
को आवंटित करने वाली रेखा के रूप में दोषी ठहरा रहा था।
अनुमानित आवंटन पैटर्न के परिणामस्वरूप कोड लिखने के बारे में कोई भी मदद या सामान्य युक्तियों की अत्यधिक सराहना की जाती है।
इसे समझने के लिए स्लेथिंग पर अच्छा काम, एक व्यक्तिगत समाधान विकसित करना, और फिर इसे वैश्वीकृत करना! –