ความสัมพันธ์ระหว่าง BLAS, LAPACK และ ATLAS คืออะไร


143

ฉันไม่เข้าใจว่า BLAS, LAPACK และ ATLAS เกี่ยวข้องกันอย่างไรและฉันควรใช้มันอย่างไรด้วยกัน! ฉันดูคู่มือทั้งหมดของพวกเขาและฉันมีความคิดทั่วไปเกี่ยวกับ BLAS และ LAPACK และวิธีการใช้กับตัวอย่างที่ฉันพบ แต่ฉันไม่สามารถหาตัวอย่างที่แท้จริงได้โดยใช้ ATLAS เพื่อดูว่ามันเกี่ยวข้องกับอะไร สองคนนี้

ฉันพยายามทำงานเมทริกซ์ระดับต่ำและภาษาหลักของฉันคือ C ขั้นแรกฉันต้องการใช้ GSL แต่มันบอกว่าถ้าคุณต้องการประสิทธิภาพที่ดีที่สุดคุณควรใช้ BLAS และ ATLAS มีหน้าเว็บที่ดีให้ตัวอย่างที่ดีของวิธีการใช้ (ใน C) เหล่านี้ทั้งหมดด้วยกันไหม? ในคำอื่น ๆ ฉันกำลังมองหาการสอนเกี่ยวกับการใช้ทั้งสาม (หรือส่วนย่อยของพวกเขา!) ในระยะสั้นฉันสับสน!


คำตอบ:


156

BLAS เป็นการรวบรวมเมทริกซ์ระดับต่ำและการดำเนินการทางคณิตศาสตร์ของเวกเตอร์ (“ คูณเวกเตอร์ด้วยสเกลาร์”,“ คูณเมทริกซ์สองตัวและเพิ่มเมทริกซ์ที่สาม” และอื่น ๆ )

LAPACK คือชุดของการดำเนินการพีชคณิตเชิงเส้นระดับสูง สิ่งต่าง ๆ เช่นเมทริกซ์ factorizations (LU, LLt, QR, SVD, Schur ฯลฯ ) ที่ใช้ทำสิ่งต่าง ๆ เช่น "ค้นหาค่าลักษณะเฉพาะของเมทริกซ์" หรือ "ค้นหาค่าเอกพจน์ของเมทริกซ์" หรือ "แก้ระบบเชิงเส้น ” LAPACK ถูกสร้างขึ้นบน BLAS; ผู้ใช้ LAPACK จำนวนมากใช้อินเตอร์เฟส LAPACK เท่านั้นและไม่จำเป็นต้องทราบ BLAS เลย โดยทั่วไป LAPACK จะถูกรวบรวมแยกต่างหากจาก BLAS และสามารถใช้การปรับใช้ BLAS ที่มีประสิทธิภาพสูงสุดที่คุณมี

ATLAS เป็นการใช้งานแบบพกพาที่ดีพอสมควรของส่วนต่อประสาน BLAS ซึ่งใช้การดำเนินการ LAPACK ที่ใช้บ่อยที่สุดสองสามอย่าง

สิ่งที่“ คุณควรใช้” ขึ้นอยู่กับรายละเอียดของสิ่งที่คุณพยายามทำและแพลตฟอร์มที่คุณใช้ คุณจะไม่ผิดไปมากนักกับ“ ใช้ ATLAS + LAPACK”


ขอบคุณสำหรับคำอธิบาย คุณรู้จักตัวอย่างของวิธีใช้ ATLAS + LAPACK หรือไม่? ฉันต้องการเห็นตัวอย่างเล็ก ๆ น้อย ๆ เพื่อทำความเข้าใจวิธีใช้สิ่งเหล่านี้! ฉันเข้าใจสิ่งที่พวกเขามีและทฤษฎีของสิ่งที่พวกเขาทำ แต่ฉันแทบจะไม่สามารถหาตัวอย่างใด ๆ ใน C เกี่ยวกับวิธีการใช้ในการปฏิบัติ
makhlaghi

1
@astroboy: คุณช่วยให้ข้อมูลฉันเกี่ยวกับสิ่งที่คุณพยายามทำจริง ๆ ได้ไหม LAPACK โดยเฉพาะเป็นห้องสมุดขนาดใหญ่
Stephen Canon

สำหรับความเรียบง่ายสมมติว่าฉันมีเมทริกซ์และฉันต้องการคูณมันด้วยค่าที่แน่นอน ฉันจะทำเช่นนี้รวม ATLAS และ (LAPACK หรือ BLAS) ใน C ได้อย่างไร ฉันแค่อยากจะเห็นวิธีการใช้ฟังก์ชั่นใด ๆ เหล่านี้ มีตัวอย่างบางส่วนในnetlib.org/lapack/lapacke.htmlแต่ไม่มีการกล่าวถึง ATLAS!
makhlaghi

มีอะไรอย่าง BLAS, LAPACK หรือ MKL ที่สามารถทำงานกับ objetcs ที่ใหญ่กว่าหน่วยความจำได้อย่างชัดเจน?
skan

1
@ MinhNghĩa: มีมาตรฐานคือnetlib.org/blas/blast-forumแต่ (ก) ไม่มีการบังคับใช้ - มาตรฐานหากไม่มีชุดทดสอบนั้นไม่ใช่มาตรฐาน - และ (b) ฉันไม่คิดว่า ทุกคนใช้ชุดเต็มของอินเทอร์เฟซที่อธิบายโดยเอกสารนั้น มันเอ่อแรงบันดาลใจ
สตีเฟ่น Canon

40

ในขณะที่เมื่อก่อนฉันเริ่มทำพีชคณิตเชิงเส้นในCฉันรู้สึกประหลาดใจเมื่อเห็นว่ามีบทเรียนไม่กี่BLASอย่างLAPACKและพื้นฐานอื่น ๆAPIถึงแม้ว่าพวกเขาจะเป็นเสาหลักของห้องสมุดอื่น ๆ สำหรับเหตุผลที่ผมเริ่มเก็บรวบรวมทั้งหมดตัวอย่าง tutorials / ฉันสามารถหาทั้งหมดผ่านทางอินเทอร์เน็ตสำหรับBLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS,OpenBLAS ... ในการนี้ repo

ฉันควรเตือนคุณว่าในฐานะวิศวกรเครื่องกลฉันมีประสบการณ์เพียงเล็กน้อยในการจัดการที่เก็บ git หรือ GitHub ก่อนอื่นมันจะดูเป็นระเบียบอย่างสมบูรณ์สำหรับพวกคุณ อย่างไรก็ตามหากคุณสามารถจัดการกับโครงสร้างที่ยุ่งเหยิงได้คุณจะพบตัวอย่างและคำแนะนำทุกประเภทที่อาจช่วยได้ ฉันได้ลองพวกเขาส่วนใหญ่เพื่อให้แน่ใจว่าพวกเขารวบรวม และสิ่งที่ไม่ได้รวบรวมฉันได้กล่าวถึง ฉันได้แก้ไขมากของพวกเขาจะเป็น compilable กับGNU compilers( gcc, g++และgfortran) ฉันได้ทำMakeFileสิ่งที่คุณสามารถอ่านเพื่อเรียนรู้วิธีเรียกแต่ละรูทีนFortran/FORTRANในโปรแกรมCหรือC++โปรแกรม ฉันยังได้ใส่คำแนะนำในการติดตั้งสำหรับ mac และ linux (ขออภัย windows guys!) ฉันยังทำบางอย่างbash .sh ไฟล์สำหรับการรวบรวมอัตโนมัติของบางส่วนของห้องสมุดเหล่านี้

แต่จะไปคำถามอื่น ๆ ของคุณ: BLASและLAPACKค่อนข้างAPIไม่เฉพาะเจาะจงSDKs นี่เป็นเพียงรายการข้อกำหนดหรือส่วนขยายภาษามากกว่าการนำไปใช้งานหรือไลบรารี กับที่กล่าวว่ามีการใช้งานต้นฉบับโดยnetlibในFORTRAN 77ซึ่งคนส่วนใหญ่หมายถึง (พลุกพล่าน!) เมื่อพูดถึงและBLAS LAPACKดังนั้นหากคุณเห็นสิ่งแปลก ๆ มากมายเมื่อใช้สิ่งเหล่านี้APIเป็นเพราะคุณกำลังเรียกFORTRANกิจวัตรประจำวันCมากกว่าCห้องสมุดและฟังก์ชั่น ATLASและOpenBLASเป็นการนำไปปฏิบัติที่ดีที่สุดBLASและLACPACKเท่าที่ฉันรู้ พวกเขาสอดคล้องกับต้นฉบับAPIแม้ว่าจะนำความรู้ของฉันไปปฏิบัติC/C++ตั้งแต่เริ่มต้น (ไม่แน่ใจ!) มีการใช้งาน GPGPU ของการAPIใช้OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFireและViennaCLเพื่อพูดถึงบางอย่าง นอกจากนี้ยังมีการใช้งานเฉพาะของผู้ขายที่ปรับให้เหมาะกับฮาร์ดแวร์หรือแพลตฟอร์มเฉพาะซึ่งฉันขอแนะนำให้ทุกคนใช้อย่างเด็ดขาด

คำแนะนำของฉันกับทุกคนที่ต้องการเรียนรู้การใช้BLASและLAPACKในCคือการเรียนรู้FORTRAN-Cการเขียนโปรแกรมแบบผสมก่อน บทแรกของธุรกรรมซื้อคืนที่กล่าวถึงได้ทุ่มเทให้กับเรื่องนี้และฉันได้รวบรวมตัวอย่างที่แตกต่างกันมากมาย

ป.ล.ฉันได้ทำงานกับสาขา dev ของพื้นที่เก็บข้อมูลเป็นครั้งคราว ดูเหมือนว่ายุ่งน้อยลงเล็กน้อย!


หน้า Wikipedia สำหรับ LAPACK เริ่มต้นด้วย "LAPACK (Linear Algebra Package) เป็นไลบรารี่ซอฟต์แวร์มาตรฐาน" คุณกำลังพูดว่าไม่ถูกต้องเนื่องจากเป็นข้อกำหนด API และไม่ใช่การนำไปใช้
Noah_S

1
หลังจากการวิจัยบางอย่างดูเหมือนว่า LAPACK และ BLAS เป็นการนำไปใช้งานจริง จากคำถามที่พบบ่อยของ NetLib บน BLAS: "BLAS (โปรแกรมพีชคณิตเชิงเส้นพื้นฐาน) เป็นกิจวัตรที่มีการสร้างบล็อคมาตรฐานสำหรับการดำเนินการเวกเตอร์และเมทริกซ์พื้นฐาน" จากหน้า GitHub ของ LAPACK: "LAPACK เป็นห้องสมุดของรูทีนย่อยของ Fortran" จากนั้นและจากการอ่านผ่านโครงการ GitHub ของ LAPACK ความประทับใจของฉันคือ BLAS และ LAPACK นั้นเป็นการนำไปใช้จริง - LAPACK สร้างบน BLAS เพื่อมอบฟังก์ชันการทำงานที่ซับซ้อนยิ่งขึ้น
Noah_S

1
@Noah_S ฉันจะไม่ใช้ Wikipedia เป็นข้อมูลอ้างอิง "แต่" สำหรับความรู้ที่ จำกัด ของฉันมี LAPACK ที่ใช้งานได้หลายอย่าง ฉันคิดว่าการเรียกใช้ API นั้นแม่นยำกว่านี้ แต่โปรดแก้ไขให้ฉันถ้าฉันผิด
โหลด

2
ฉันคิดว่าส่วนหนึ่งของความสับสนคือ BLAS เป็น API / ข้อมูลจำเพาะ แต่ยังมี "การใช้งานอ้างอิง" ของ BLAS (จาก Netlib) ที่เรียกว่าเป็นเพียงแค่ "ห้องสมุด BLAS" โดยทั่วไปเมื่อมีคนพูดว่า BLAS พวกเขาหมายถึง API เพราะการใช้งานอ้างอิงไม่ได้รับการปรับให้เหมาะสมดังนั้นจึงไม่ได้มีการใช้มากนักในทางปฏิบัติ / อุตสาหกรรม ATLAS จัดเตรียมการปรับใช้ที่เหมาะสมของรูทีนย่อย LAPACK สองสามตัวและจากนั้นเลือกที่จะดึงส่วนที่เหลือจาก LAPACK เองเพื่อสร้างการนำ LAPACK ไปใช้ในไฟล์ ATLAS lib ที่สร้างขึ้น
Andrew Janke

1
@Noah_S ไม่มีข้อโต้แย้งแต่ละไลบรารีมี API ซึ่งทำให้สามารถปรับใช้ฟังก์ชันการทำงานจริงได้ในขณะที่ยังคงใช้งานร่วมกับ API ได้และนั่นเป็นสิ่งที่เกิดขึ้นกับ LAPACK
Andrey

17

ATLAS ค่อนข้างล้าสมัยไปแล้ว มันถูกพัฒนาขึ้นในช่วงเวลาที่คิดว่าการเพิ่มประสิทธิภาพ BLAS สำหรับแพลตฟอร์มต่าง ๆ นั้นเกินความสามารถของมนุษย์และผลของการสร้างระบบอัตโนมัติและการหาค่าอัตโนมัติก็เป็นวิธีที่จะไป

ในช่วงต้นยุค 2000 Kazushige Goto พร้อมที่แสดงให้เห็นว่าการใช้งานที่มีประสิทธิภาพสูงสามารถเขียนด้วยมือได้อย่างไร คุณอาจเพลิดเพลินกับบทความที่น่าสนใจใน New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- คอมพิวเตอร์

ของ Kazushige บนมือข้างหนึ่งมีความเข้าใจในทฤษฎีที่ดีขึ้นหลังการใช้งานที่มีประสิทธิภาพสูงของการคูณเมทริกซ์เมทริกซ์และในทางกลับกันการออกแบบเหล่านี้ดีกว่า วิธีการของเขาซึ่งบน CPUs ปัจจุบันมักจะมีประสิทธิภาพสูงสุดไม่ได้อยู่ในพื้นที่ค้นหาที่ ATLAS เล่นเพลงอัตโนมัติ ดังนั้น ATLAS จึงด้อยกว่าโดยเนื้อแท้ การดำเนินการ BLAS ของ Kazushige ได้กลายเป็นที่รู้จักในนาม GotoBLAS มันถูกแยกเป็น OpenBLAS เมื่อเขาเข้าร่วมอุตสาหกรรม

แนวคิดที่อยู่เบื้องหลัง GotoBLAS ได้รับการปรับเปลี่ยนใหม่ให้เป็นการนำไปใช้งานใหม่กรอบการทำงานของซอฟท์แวร์ไลบรารีที่มีลักษณะเหมือน BLAS (BLIS) ( https://github.com/flame/blis ) ซึ่งใช้อัลกอริธึมเดียวกัน แต่สร้างโครงสร้างเพื่อให้น้อย จะต้องมีการปรับแต่งตามความต้องการสำหรับสถาปัตยกรรมใหม่ BLIS เขียนเป็น C

สิ่งที่การสนทนานี้แสดงให้เห็นคือมีการนำ BLAS มาใช้อย่างมากมาย BLAS เป็นมาตรฐานสำหรับอินเทอร์เฟซ ATLAS ครั้งหนึ่งเคยเป็นรัฐของศิลปะ มันไม่มีอีกต่อไป


0

เท่าที่ฉันทราบและหลังจากทำงานผ่านที่เก็บ ATLAS ดูเหมือนว่าจะมีการใช้งาน BLAS ใน C อีกครั้งมันมีมากกว่านั้น แต่ฉันหวังว่ามันจะตอบคำถาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.