จุดเริ่มต้นที่ดีคือหนังสือThe Science of Programming Matrix Computationsโดย Robert A. van de Geijn และ Enrique S. Quintana-Ortí มีเวอร์ชันดาวน์โหลดฟรี
BLAS แบ่งออกเป็นสามระดับ:
ระดับ 1 กำหนดชุดของฟังก์ชันพีชคณิตเชิงเส้นที่ทำงานบนเวกเตอร์เท่านั้น ฟังก์ชันเหล่านี้ได้รับประโยชน์จาก vectorization (เช่นจากการใช้ SSE)
ฟังก์ชันระดับ 2 คือการดำเนินการเมทริกซ์ - เวกเตอร์เช่นผลิตภัณฑ์เมทริกซ์ - เวกเตอร์บางอย่าง ฟังก์ชันเหล่านี้สามารถใช้งานได้ในรูปแบบของฟังก์ชัน Level1 อย่างไรก็ตามคุณสามารถเพิ่มประสิทธิภาพของฟังก์ชันนี้ได้หากคุณสามารถจัดเตรียมการใช้งานเฉพาะที่ใช้สถาปัตยกรรมมัลติโปรเซสเซอร์บางตัวกับหน่วยความจำแบบแบ่งใช้
ฟังก์ชันระดับ 3 เป็นการดำเนินการเช่นเดียวกับผลิตภัณฑ์เมทริกซ์ - เมทริกซ์ อีกครั้งคุณสามารถใช้งานได้ในแง่ของฟังก์ชัน Level2 แต่ฟังก์ชัน Level3 จะดำเนินการ O (N ^ 3) บนข้อมูล O (N ^ 2) ดังนั้นหากแพลตฟอร์มของคุณมีลำดับชั้นแคชแล้วคุณสามารถเพิ่มประสิทธิภาพการทำงานถ้าคุณให้การดำเนินงานเฉพาะที่เป็นแคช Optimized / แคชมิตร มีอธิบายไว้อย่างดีในหนังสือเล่มนี้ การเพิ่มประสิทธิภาพหลักของฟังก์ชั่น Level3 มาจากการเพิ่มประสิทธิภาพแคช การเพิ่มนี้สูงกว่าการเพิ่มครั้งที่สองจากการทำงานแบบขนานและการเพิ่มประสิทธิภาพฮาร์ดแวร์อื่น ๆ อย่างมาก
อย่างไรก็ตามการใช้งาน BLAS ประสิทธิภาพสูงส่วนใหญ่ (หรือทั้งหมด) จะไม่ถูกนำไปใช้ใน Fortran ATLAS ถูกนำไปใช้ใน C. GotoBLAS / OpenBLAS ถูกนำไปใช้ใน C และส่วนที่สำคัญด้านประสิทธิภาพใน Assembler เฉพาะการใช้งานอ้างอิงของ BLAS เท่านั้นที่ถูกนำไปใช้ใน Fortran อย่างไรก็ตามการใช้งาน BLAS ทั้งหมดนี้มีอินเทอร์เฟซ Fortran ที่สามารถเชื่อมโยงกับ LAPACK ได้ (LAPACK ได้รับประสิทธิภาพทั้งหมดจาก BLAS)
คอมไพเลอร์ที่ปรับให้เหมาะสมมีบทบาทเล็กน้อยในแง่นี้ (และสำหรับ GotoBLAS / OpenBLAS คอมไพเลอร์ไม่สำคัญเลย)
IMHO ไม่มีการใช้งาน BLAS ใช้อัลกอริทึมเช่น Coppersmith – Winograd algorithm หรือ Strassen algorithm ฉันไม่แน่ใจเกี่ยวกับเหตุผล แต่นี่คือการคาดเดาของฉัน:
- อาจเป็นไปไม่ได้ที่จะให้การปรับใช้แคชของอัลกอริทึมเหล่านี้ให้เหมาะสมที่สุด (เช่นคุณจะหลวมมากขึ้นแล้วคุณจะชนะ)
- อัลกอริทึมเหล่านี้ไม่คงที่ในเชิงตัวเลข เนื่องจาก BLAS เป็นเคอร์เนลการคำนวณของ LAPACK จึงไม่ต้องไป
แก้ไข / ปรับปรุง:
ใหม่และพื้นดินกระดาษทำลายสำหรับหัวข้อนี้เป็นเอกสาร BLIS พวกเขาเขียนได้ดีเป็นพิเศษ สำหรับการบรรยาย "Software Basics for High Performance Computing" ของฉันฉันใช้ผลิตภัณฑ์เมทริกซ์ - เมทริกซ์ตามกระดาษของพวกเขา อันที่จริงฉันใช้ผลิตภัณฑ์เมทริกซ์ - เมทริกซ์หลายรูปแบบ ตัวแปรที่ง่ายที่สุดเขียนด้วยภาษา C ล้วนและมีโค้ดน้อยกว่า 450 บรรทัด ตัวแปรอื่น ๆ ทั้งหมดเพียงแค่ปรับลูปให้เหมาะสมเท่านั้น
for (l=0; l<MR*NR; ++l) {
AB[l] = 0;
}
for (l=0; l<kc; ++l) {
for (j=0; j<NR; ++j) {
for (i=0; i<MR; ++i) {
AB[i+j*MR] += A[i]*B[j];
}
}
A += MR;
B += NR;
}
ประสิทธิภาพการทำงานโดยรวมของผลิตภัณฑ์แมทริกซ์เมทริกซ์เท่านั้นขึ้นอยู่กับลูปเหล่านี้ ประมาณ 99.9% ของเวลาที่ใช้ที่นี่ ในตัวแปรอื่น ๆ ฉันใช้รหัสภายในและรหัสแอสเซมเบลอร์เพื่อปรับปรุงประสิทธิภาพ คุณสามารถดูบทช่วยสอนเกี่ยวกับตัวแปรทั้งหมดได้ที่นี่:
ulmBLAS: บทช่วยสอนเกี่ยวกับ GEMM (ผลิตภัณฑ์เมทริกซ์ - เมทริกซ์)
เมื่อใช้ร่วมกับเอกสาร BLIS จะทำให้เข้าใจได้ง่ายว่าไลบรารีอย่าง Intel MKL จะได้รับประสิทธิภาพดังกล่าวได้อย่างไร และเหตุใดจึงไม่สำคัญว่าคุณจะใช้ที่เก็บข้อมูลหลักของแถวหรือคอลัมน์!
เกณฑ์มาตรฐานสุดท้ายอยู่ที่นี่ (เราเรียกว่าโครงการของเรา ulmBLAS):
เกณฑ์มาตรฐานสำหรับ ulmBLAS, BLIS, MKL, openBLAS และ Eigen
แก้ไข / ปรับปรุงอื่น ๆ :
ฉันยังเขียนบทช่วยสอนเกี่ยวกับวิธีใช้ BLAS สำหรับปัญหาพีชคณิตเชิงเส้นเชิงตัวเลขเช่นการแก้ระบบสมการเชิงเส้น:
LU Factorization ประสิทธิภาพสูง
(การแยกตัวประกอบ LU นี้เป็นตัวอย่างที่ Matlab ใช้ในการแก้ระบบสมการเชิงเส้น)
ฉันหวังว่าจะหาเวลาที่จะขยายการกวดวิชาเพื่ออธิบายและแสดงให้เห็นถึงวิธีการที่จะตระหนักถึงการดำเนินงานที่ปรับขนาดได้อย่างขนานของตัวประกอบ LU เช่นในพลาสม่า
ได้เลย: Coding a Cache Optimized Parallel LU Factorization
PS: ฉันได้ทำการทดลองเกี่ยวกับการปรับปรุงประสิทธิภาพของ uBLAS ด้วย จริงๆแล้วมันค่อนข้างง่ายที่จะเพิ่มประสิทธิภาพ (ใช่เล่นคำ :)) ประสิทธิภาพของ uBLAS:
การทดลองใน uBLAS
นี่คือโครงการที่คล้ายกันกับBLAZE :
การทดลองใน BLAZE