संपादित करें: मेरा नमूना आकार बहुत छोटा था। जब मैंने 8 सीपीयू के वास्तविक डेटा के खिलाफ इसे चलाया, तो मैंने 7.2x की गति में वृद्धि देखी। मेरे कोड में 4 वर्ण जोड़ने के लिए बहुत शर्मीली नहीं है;)स्कैला समांतर संग्रह रनटाइम गूढ़
मैं वर्तमान में स्कैला का उपयोग करने के लाभों पर 'बिक्री' प्रबंधन की कोशिश करने की प्रक्रिया में हूं, खासकर जब यह CPU के साथ स्केलिंग की बात आती है। इसके अंत में, मैंने एक साधारण परीक्षण अनुप्रयोग बनाया जो वेक्टर गणित का एक गुच्छा करता है और यह पता लगाने में थोड़ा आश्चर्य हुआ कि रनटाइम मेरी क्वाड-कोर मशीन पर बेहतर नहीं था। दिलचस्प बात यह है कि, मैंने पाया कि रनटाइम पहली बार संग्रह के माध्यम से सबसे खराब है और बाद के कॉल के साथ बेहतर हो जाता है। क्या समानांतर संग्रह में कुछ आलसी चीजें हैं जो इसका कारण बन रही हैं, या क्या मैं यह गलत कर रहा हूं? यह ध्यान दिया जाना चाहिए कि मैं सी ++/सी # दुनिया से आया हूं, इसलिए यह पूरी तरह से संभव है कि मैंने किसी भी तरह से मेरी कॉन्फ़िगरेशन को गड़बड़ कर दिया है।
InteliJ स्काला प्लगइन
स्काला 2.9.1.final
विंडोज 7 64 बिट, क्वाड-कोर प्रोसेसर (कोई हाइपरथ्रेडिंग)
import util.Random
// simple Vector3D class that has final x,y,z components a length, and a '-' function
class Vector3D(val x:Double, val y:Double, val z:Double)
{
def length = math.sqrt(x*x+y*y+z*z)
def -(rhs : Vector3D) = new Vector3D(x - rhs.x, y - rhs.y, z - rhs.z)
}
object MainClass {
def main(args : Array[String]) =
{
println("Available CPU's: " + Runtime.getRuntime.availableProcessors())
println("Parallelism Degree set to: " + collection.parallel.ForkJoinTasks.defaultForkJoinPool.getParallelism);
// my position
val myPos = new Vector3D(0,0,0);
val r = new Random(0);
// define a function nextRand that gets us a random between 0 and 100
def nextRand = r.nextDouble() * 100;
// make 10 million random targets
val targets = (0 until 10000000).map(_ => new Vector3D(nextRand, nextRand, nextRand)).toArray
// take the .par hit before we start profiling
val parTargets = targets.par
println("Created " + targets.length + " vectors")
// define a range function
val rangeFunc : (Vector3D => Double) = (targetPos) => (targetPos - myPos).length
// we'll select ones that are <50
val within50 : (Vector3D => Boolean) = (targetPos) => rangeFunc(targetPos) < 50
// time it sequentially
val startTime_sequential = System.currentTimeMillis()
val numTargetsInRange_sequential = targets.filter(within50)
val endTime_sequential = System.currentTimeMillis()
println("Sequential (ms): " + (endTime_sequential - startTime_sequential))
// do the parallel version 10 times
for(i <- 1 to 10)
{
val startTime_par = System.currentTimeMillis()
val numTargetsInRange_parallel = parTargets.filter(within50)
val endTime_par = System.currentTimeMillis()
val ms = endTime_par - startTime_par;
println("Iteration[" + i + "] Executed in " + ms + " ms")
}
}
}
के उत्पादन: भले ही, यहां मेरे सेटअप है यह प्रोग्राम है:
Available CPU's: 4
Parallelism Degree set to: 4
Created 10000000 vectors
Sequential (ms): 216
Iteration[1] Executed in 227 ms
Iteration[2] Executed in 253 ms
Iteration[3] Executed in 76 ms
Iteration[4] Executed in 78 ms
Iteration[5] Executed in 77 ms
Iteration[6] Executed in 80 ms
Iteration[7] Executed in 78 ms
Iteration[8] Executed in 78 ms
Iteration[9] Executed in 79 ms
Iteration[10] Executed in 82 ms
तो यहां क्या हो रहा है? पहले 2 बार हम फ़िल्टर करते हैं, यह धीमा है, और फिर चीजें तेज हो जाती हैं? मैं समझता हूं कि मूल रूप से समांतरता स्टार्टअप लागत होगी, मैं सिर्फ यह पता लगाने की कोशिश कर रहा हूं कि मेरे एप्लिकेशंस में समांतरता को व्यक्त करने के लिए यह समझ में आता है, और विशेष रूप से मैं प्रबंधन को एक प्रोग्राम दिखाने में सक्षम होना चाहता हूं जो 3-4 बार चलता है एक क्वाड कोर बॉक्स पर तेजी से। क्या यह सिर्फ एक अच्छी समस्या नहीं है?
विचार?
आप देख रहे हैं कि कैसे प्रबंधन बेचने के लिए पर कुछ विचार के लिए, आप (तीर कुंजियों का उपयोग अगली स्लाइडों को देखने के लिए) http://scala-boss.heroku.com/#1 पर एक नज़र हो सकता है। – huynhjl
सामान्य रूप से, समानांतर वैक्टरों के समानांतर सरणी पसंद करते हैं, कम से कम जब तक वैक्टर में कॉन्सेट जोड़े जाते हैं। – axel22
@huynhjl - मुझे पता था कि प्रस्तुति कुछ मूल्यवान थी जब मैंने अपने जीवन को पहले दो कॉमिक्स में चित्रित किया था। धन्यवाद! – fbl