การจับเวลา parSapply()
การรันเกมลูกเต๋าเป็นตัวอย่างของงานแบบ embarrassingly parallel การจำลองประเภทนี้มักจะให้ความเร็วที่เพิ่มขึ้นอย่างเห็นได้ชัด (แม้ไม่ใช่ทุกกรณี) เช่นเดิม สามารถใช้ microbenchmark() หรือ system.time() ได้ เพื่อความเรียบง่าย แบบฝึกหัดนี้จะใช้ system.time()
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การเขียน R Code อย่างมีประสิทธิภาพ
คำแนะนำการฝึกหัด
ฟังก์ชัน play() ถูกกำหนดไว้ใน workspace แล้ว สมมติว่าต้องการเล่นเกมหนึ่งแสนครั้ง
- กำหนดให้
no_of_gamesมีค่าเป็น1e5 - ใช้
system.time()เพื่อจับเวลาการเรียกplay()แบบ serial- เรียก
sapply()โดยส่ง1:no_of_gamesและฟังก์ชัน wrapperplay()เป็นอาร์กิวเมนต์ - เก็บผลลัพธ์ไว้ในตัวแปร
serial - ครอบการเรียกนี้ด้วย
system.time()เพื่อจับเวลา
- เรียก
- สร้าง cluster object แบบ 4 core และ export ฟังก์ชัน
play()ไปยัง cluster - ใช้
system.time()เพื่อจับเวลาการเรียกplay()แบบ parallel- ปรับโค้ดที่ใช้สร้าง
serialให้ทำงานแบบ parallel แทน
- ปรับโค้ดที่ใช้สร้าง
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Set the number of games to play
no_of_games <- ___
# Time serial version
system.time(serial <- sapply(1:___, function(i) play()))
# Set up cluster
cl <- makeCluster(___)
clusterExport(cl, "play")
# Time parallel version
system.time(par <- ___)
# Stop cluster
stopCluster(cl)