อัพเดท (30.07.2014):
ฉันเรียกใช้เกณฑ์มาตรฐานใหม่ใน HPC ใหม่ของเรา ทั้งฮาร์ดแวร์และซอฟต์แวร์สแต็กเปลี่ยนไปจากการตั้งค่าในคำตอบเดิม
ฉันใส่ผลลัพธ์ในGoogle สเปรดชีต (มีผลลัพธ์จากคำตอบเดิมด้วย)
ฮาร์ดแวร์
HPC ของเรามีสองโหนดที่แตกต่างกันหนึ่งโหนดที่มีซีพียู Intel Sandy Bridge และอีกโหนดหนึ่งมีซีพียู Ivy Bridge รุ่นใหม่:
แซนดี้ (MKL, OpenBLAS, ATLAS):
- CPU : 2 x 16 Intel (R) Xeon (R) E2560 Sandy Bridge @ 2.00GHz (16 คอร์)
- แรม : 64 GB
ไอวี่ (MKL, OpenBLAS, ATLAS):
- CPU : 2 x 20 Intel (R) Xeon (R) E2680 V2 Ivy Bridge @ 2.80GHz (20 Cores, with HT = 40 Cores)
- แรม : 256 GB
ซอฟต์แวร์
สแต็กซอฟต์แวร์มีไว้สำหรับทั้งสองโหนด sam แทนที่จะGotoBLAS2 , OpenBLASถูกนำมาใช้และยังมีแบบมัลติเธรด ATLASหน่ายที่ถูกกำหนดเป็น 8 เธรด (hardcoded)
- ระบบปฏิบัติการ : Suse
- Intel Compiler : ictce-5.3.0
- หมายเลข: 1.8.0
- OpenBLAS: 0.2.6
- ATLAS : 3.8.4
Dot-Product Benchmark
Benchmark-code เหมือนกับด้านล่าง อย่างไรก็ตามสำหรับเครื่องใหม่ผมยังวิ่งมาตรฐานสำหรับเมทริกซ์ขนาด5000และ8000
ตารางด้านล่างประกอบด้วยผลการเปรียบเทียบจากคำตอบเดิม (เปลี่ยนชื่อเป็น: MKL -> Nehalem MKL, Netlib Blas -> Nehalem Netlib BLAS เป็นต้น)
ประสิทธิภาพเธรดเดียว:
ประสิทธิภาพแบบมัลติเธรด (8 เธรด):
เธรดเทียบกับขนาดเมทริกซ์ (Ivy Bridge MKL) :
Benchmark Suite
ประสิทธิภาพเธรดเดียว:
มัลติเธรด (8 เธรด) ประสิทธิภาพ:
สรุป
ผลการเปรียบเทียบใหม่จะคล้ายกับผลลัพธ์ในคำตอบเดิม OpenBLASและMKLดำเนินการในระดับเดียวกันยกเว้นการทดสอบEigenvalue eigenvalueดำเนินการทดสอบเพียงได้ดีพอสมควรในOpenBLASในโหมดเกลียวเดียว ในโหมดมัลติเธรดประสิทธิภาพจะแย่ลง
"ขนาดเมทริกซ์ VS หัวข้อกราฟ"ยังแสดงให้เห็นว่าถึงแม้จะ MKL เช่นเดียวกับ OpenBLAS ทั่วไประดับดีมีจำนวนแกน / กระทู้, มันขึ้นอยู่กับขนาดของเมทริกซ์ สำหรับเมทริกซ์ขนาดเล็กการเพิ่มคอร์มากขึ้นจะไม่ช่วยเพิ่มประสิทธิภาพมากนัก
นอกจากนี้ยังมีประสิทธิภาพเพิ่มขึ้นประมาณ 30% จากSandy Bridgeเป็นIvy Bridgeซึ่งอาจเป็นเพราะอัตราสัญญาณนาฬิกาที่สูงขึ้น (+ 0.8 Ghz) และ / หรือสถาปัตยกรรมที่ดีกว่า
คำตอบเดิม (04.10.2011):
เมื่อไม่นานมานี้ฉันต้องเพิ่มประสิทธิภาพการคำนวณพีชคณิตเชิงเส้น / อัลกอริทึมที่เขียนด้วย python โดยใช้ numpy และ BLAS ดังนั้นฉันจึงเปรียบเทียบ / ทดสอบการกำหนดค่า numpy / BLAS ที่แตกต่างกัน
ฉันทดสอบโดยเฉพาะ:
- Numpy กับ ATLAS
- Numpy กับGotoBlas2 (1.13)
- Numpy กับ MKL (11.1 / 073)
- Numpy พร้อม Accelerate Framework (Mac OS X)
ฉันใช้เกณฑ์มาตรฐานที่แตกต่างกันสองแบบ:
- ผลิตภัณฑ์ดอทอย่างง่ายของเมทริกซ์ที่มีขนาดแตกต่างกัน
- ชุดมาตรฐานซึ่งสามารถพบได้ที่นี่
นี่คือผลลัพธ์ของฉัน:
เครื่องจักร
ลินุกซ์ (MKL, ATLAS, No-MKL, GotoBlas2):
- ระบบปฏิบัติการ : Ubuntu Lucid 10.4 64 Bit.
- CPU : 2 x 4 Intel (R) Xeon (R) E5504 @ 2.00GHz (8 คอร์)
- แรม : 24 GB
- Intel Compiler : 11.1 / 073
- Scipy : 0.8
- Numpy : 1.5
Mac Book Pro (Accelerate Framework):
- ระบบปฏิบัติการ : MacOS X Snow Leopard (10.6)
- CPU : 1 Intel Core 2 Duo 2.93 Ghz (2 คอร์)
- แรม : 4 GB
- ไซปี้ : 0.7
- ตัวเลข : 1.3
เซิร์ฟเวอร์ Mac (Accelerate Framework):
- ระบบปฏิบัติการ : MacOS X Snow Leopard Server (10.6)
- CPU : 4 X Intel (R) Xeon (R) E5520 @ 2.26 Ghz (8 คอร์)
- แรม : 4 GB
- Scipy : 0.8
- ตัวเลข : 1.5.1
มาตรฐานผลิตภัณฑ์ Dot
รหัส :
import numpy as np
a = np.random.random_sample((size,size))
b = np.random.random_sample((size,size))
%timeit np.dot(a,b)
ผลลัพธ์ :
ระบบ | ขนาด = 1000 | ขนาด = 2000 | ขนาด = 3000 |
netlib BLAS | 1350 มิลลิวินาที | 10900 มิลลิวินาที | 39200 มิลลิวินาที |
ATLAS (1 CPU) | 314 มิลลิวินาที | 2560 มิลลิวินาที | 8700 มิลลิวินาที |
MKL (1 ซีพียู) | 268 มิลลิวินาที | 2110 มิลลิวินาที | 7120 มิลลิวินาที |
MKL (2 ซีพียู) | - | - | 3660 มิลลิวินาที |
MKL (8 ซีพียู) | 39 มิลลิวินาที | 319 มิลลิวินาที | 1,000 มิลลิวินาที |
GotoBlas2 (1 CPU) | 266 มิลลิวินาที | 2100 มิลลิวินาที | 7280 มิลลิวินาที |
GotoBlas2 (2 ซีพียู) | 139 มิลลิวินาที | 1009 มิลลิวินาที | 3690 มิลลิวินาที |
GotoBlas2 (8 ซีพียู) | 54 มิลลิวินาที | 389 มิลลิวินาที | 1250 มิลลิวินาที |
Mac OS X (1 CPU) | 143 มิลลิวินาที | 1060 มิลลิวินาที | 3605 มิลลิวินาที |
Mac Server (1 CPU) | 92 มิลลิวินาที | 714 มิลลิวินาที | 2130 มิลลิวินาที |
Benchmark Suite
รหัส :
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับชุดมาตรฐานดูที่นี่
ผลลัพธ์ :
ระบบ | ค่าลักษณะเฉพาะ | svd | det | inv | จุด |
netlib BLAS | 1688 มิลลิวินาที | 13102 มิลลิวินาที | 438 มิลลิวินาที | 2155 มิลลิวินาที | 3522 มิลลิวินาที |
ATLAS (1 CPU) | 1210 มิลลิวินาที | 5897 มิลลิวินาที | 170 มิลลิวินาที | 560 มิลลิวินาที | 893 มิลลิวินาที |
MKL (1 ซีพียู) | 691 มิลลิวินาที | 4475 มิลลิวินาที | 141 มิลลิวินาที | 450 มิลลิวินาที | 736 มิลลิวินาที |
MKL (2 ซีพียู) | 552 มิลลิวินาที | 2718 มิลลิวินาที | 96 มิลลิวินาที | 267 มิลลิวินาที | 423 มิลลิวินาที |
MKL (8 ซีพียู) | 525 มิลลิวินาที | 1679 มิลลิวินาที | 60 มิลลิวินาที | 137 มิลลิวินาที | 197 มิลลิวินาที |
GotoBlas2 (1 CPU) | 2124 มิลลิวินาที | 4636 มิลลิวินาที | 147 มิลลิวินาที | 456 มิลลิวินาที | 743 มิลลิวินาที |
GotoBlas2 (2 ซีพียู) | 1560 มิลลิวินาที | 3278 มิลลิวินาที | 116 มิลลิวินาที | 295 มิลลิวินาที | 460 มิลลิวินาที |
GotoBlas2 (8 ซีพียู) | 741 มิลลิวินาที | 2914 มิลลิวินาที | 82 มิลลิวินาที | 262 มิลลิวินาที | 192 มิลลิวินาที |
Mac OS X (1 CPU) | 948 มิลลิวินาที | 4339 มิลลิวินาที | 151 มิลลิวินาที | 318 มิลลิวินาที | 566 มิลลิวินาที |
Mac Server (1 CPU) | 1033 มิลลิวินาที | 3645 มิลลิวินาที | 99 มิลลิวินาที | 232 มิลลิวินาที | 342 มิลลิวินาที |
การติดตั้ง
การติดตั้งMKLรวมถึงการติดตั้ง Intel Compiler Suite ที่สมบูรณ์ซึ่งค่อนข้างตรงไปตรงมา อย่างไรก็ตามเนื่องจากข้อบกพร่อง / ปัญหาบางอย่างในการกำหนดค่าและการรวบรวม numpy ด้วยการสนับสนุน MKL นั้นค่อนข้างยุ่งยาก
GotoBlas2เป็นแพ็คเกจขนาดเล็กที่สามารถรวบรวมเป็นไลบรารีที่ใช้ร่วมกันได้อย่างง่ายดาย อย่างไรก็ตามเนื่องจากข้อผิดพลาดคุณต้องสร้างไลบรารีที่ใช้ร่วมกันอีกครั้งหลังจากสร้างไลบรารีเพื่อใช้กับ numpy
นอกเหนือจากการสร้างนี้แล้วสำหรับแพลตฟอร์มเป้าหมายหลายรายการไม่ได้ผลด้วยเหตุผลบางประการ ดังนั้นฉันต้องสร้างไฟล์. soสำหรับแต่ละแพลตฟอร์มที่ฉันต้องการมีไฟล์ libgoto2.so ที่ปรับให้เหมาะสม
หากคุณติดตั้ง numpy จากที่เก็บของ Ubuntu ระบบจะติดตั้งและกำหนดค่า numpy เพื่อใช้ATLASโดยอัตโนมัติ การติดตั้งATLASจากแหล่งที่มาอาจใช้เวลาสักครู่และต้องใช้ขั้นตอนเพิ่มเติม (Fortran ฯลฯ )
หากคุณติดตั้ง numpy บนเครื่อง Mac OS X กับตำรวจหรือMac พอร์ตมันอาจจะ numpy กำหนดค่าใช้ATLASหรือแอปเปิ้ลเร่งกรอบ คุณสามารถตรวจสอบได้โดยการทำงาน ldd บน numpy.core._dotblasไฟล์หรือโทรnumpy.show_config ()
ข้อสรุป
MKLดำเนินการตามที่ดีที่สุดอย่างใกล้ชิดโดยGotoBlas2
ในการทดสอบค่าลักษณะเฉพาะ GotoBlas2 มีประสิทธิภาพแย่กว่าที่คาดไว้อย่างน่าประหลาดใจ ไม่แน่ใจว่าทำไมถึงเป็นเช่นนี้
Accelerate Framework ของ Appleทำงานได้ดีมากโดยเฉพาะในโหมดเธรดเดียว (เมื่อเทียบกับการใช้งาน BLAS อื่น ๆ )
ทั้งGotoBlas2และMKLปรับขนาดได้ดีมากด้วยจำนวนเธรด ดังนั้นหากคุณต้องจัดการกับเมทริกซ์ขนาดใหญ่ที่รันบนหลายเธรดจะช่วยได้มาก
ไม่ว่าในกรณีใดอย่าใช้การใช้งานnetlib blasเริ่มต้นเนื่องจากเป็นวิธีที่ช้าเกินไปสำหรับงานด้านการคำนวณที่ร้ายแรง
ในคลัสเตอร์ของเราผมยังติดตั้งเอเอ็มดี ACMLและประสิทธิภาพการทำงานคล้ายกับMKLและGotoBlas2 ฉันไม่มีตัวเลขที่ยาก
ฉันอยากแนะนำให้ใช้GotoBlas2 เป็นการส่วนตัวเพราะติดตั้งง่ายกว่าและฟรี
หากคุณต้องการโค้ดใน C ++ / C ให้ตรวจสอบEigen3ซึ่งควรจะมีประสิทธิภาพดีกว่าMKL / GotoBlas2ในบางกรณีและยังใช้งานง่ายอีกด้วย