คำแนะนำสำหรับการแก้พีชคณิตเชิงเส้นพีชคณิตเชิงเส้นหนาแน่น / ไม่ติดตั้ง C / C น้ำหนักเบา


9

การเขียนโปรแกรมส่วนใหญ่ของฉันเป็นรหัสการวิจัยแบบครั้งเดียวใน C สำหรับการใช้งานของฉันเอง ฉันไม่เคยแจกจ่ายรหัสใด ๆ ให้แก่ผู้อื่นนอกเหนือจากผู้ทำงานร่วมกันอย่างใกล้ชิด ฉันได้พัฒนาอัลกอริทึมที่ฉันกำลังตีพิมพ์ในวารสารทางวิทยาศาสตร์ ฉันต้องการที่จะให้รหัสที่มาและบางทีรหัสที่ปฏิบัติการได้ในภาคผนวกออนไลน์ของบทความ เพื่อนร่วมงานขอให้ฉันทำการวางนัยสำหรับอัลกอริทึมที่ต้องการให้ฉันเขียนใน C ++ (แอ๊!) และต้องการให้ฉันแก้ระบบเชิงเส้นหนาแน่นขนาดเล็ก หากฉันประสบความสำเร็จในการรับฐานผู้ใช้สำหรับอัลกอริทึมมันจะเป็นส่วนหนึ่งเนื่องจากแถบรายการเพื่อใช้งานอยู่ในระดับต่ำ (เช่นบนพื้น) ผู้ใช้ที่มีศักยภาพจะไม่ติดตั้งไลบรารี ฯลฯ เพื่อใช้รหัส ฉันต้องการรหัสที่จะยืนอยู่คนเดียวอย่างเต็มที่และไม่มีภาระผูกพันโดยใบอนุญาตใด ๆ เลย ฉันอาจจะเขียนแก้ปัญหาของตัวเองโดยเอาบางอย่างออกจาก Golub และ van Loan แต่ฉันควรใช้ตัวแก้วนิลาที่คนอื่นเขียนไปแล้วถ้ามี ข้อเสนอแนะชื่นชม ขอบคุณ!



ยินดีต้อนรับสู่ฟอรัม คำถามของคุณคล้ายกับคำถามที่นี่: scicomp.stackexchange.com/questions/351/…
GertVdE

นักแก้ปัญหาห้องสมุดมักจะมีความซับซ้อนและมีขนาดใหญ่เพื่อความแข็งแกร่งประสิทธิภาพและความเป็นสากล หากปัญหาของคุณมีขนาดเล็กมากและมีสภาพดีพอสมควรฉันขอแนะนำให้คุณเขียน mini-Implement ของคุณเอง
Stefano M

@GertVdE ขอบคุณสำหรับการตอบกลับอย่างรวดเร็วของคำถามนี้ ฉันรู้สึกไม่สบายใจที่จะเชื่อมโยงกับคำถาม "คำแนะนำ ... " เพราะทั้งคำถามและคำตอบยอดนิยมนั้นกว้างเกินไปที่จะให้ความช่วยเหลือในสถานการณ์เช่นนี้ หากคุณต้องการที่จะหารือต่อไปนี้ผมขอแนะนำให้เราใช้มันไปยังห้องแชท scicomp
Aron Ahmadia

@AronAhmadia: ฉันคิดว่าวิธีเดียวที่จะเริ่มต้นการอภิปรายบางส่วนนี้คือการเริ่มใช้การเขียนโปรแกรมวิทยาศาสตร์ทางคอมพิวเตอร์ที่มีทั้งภาษาและห้องสมุด หากรหัสมีความชัดเจนและปัญหาการตั้งค่าสามารถดูแลได้ (โดยใช้เชลล์สคริปต์, เชฟหรือหุ่นเชิด) ดังนั้นการโต้วาทีเกี่ยวกับประสิทธิภาพสามารถทำได้ (หรือทำให้เป็นรูปธรรม) เพียงแค่เรียกใช้รหัสและกำหนดเวลาบน เครื่องอ้างอิง การอภิปรายเกี่ยวกับความชัดเจนสามารถแก้ไขได้ (หรืออย่างน้อยก็ทำให้เป็นรูปธรรมมากขึ้น) โดยดูที่รหัส มิฉะนั้นเราจะยังคงมีข้อโต้แย้งที่เหมือนกัน
Geoff Oxberry

คำตอบ:


7

ฉันขอแนะนำให้ตรงซ้ำอินเตอร์เฟซ LAPACK dgesvฟังก์ชั่นที่คุณต้องการมากที่สุดอาจคุณเพียงแค่ต้อง ด้วยวิธีการที่ผู้ที่ติดตั้ง Lapack สามารถเชื่อมโยงกับมันและมันจะทำงาน สำหรับผู้ที่ไม่ได้ติดตั้ง Lapack ไว้คุณสามารถใช้งานฟังก์ชั่นนี้ได้ง่ายหรืออาจนำไปใช้โดยใช้ Eigen หรือ FLENS ตามที่คนอื่น ๆ แนะนำ

ในดินแดนฟอร์แทรนห้องสมุด Lapack เป็นมาตรฐานที่คนส่วนใหญ่ใช้และนั่นก็คือแทนที่จะใช้งานของพวกเขาเอง


+1 เพิ่มไปที่ข้อเท็จจริงที่ว่าการแจกแจงลีนุกซ์ส่วนใหญ่ (อย่างน้อย Debian based) มีแพ็คเกจไบนารีในที่เก็บและผู้ขายทั้งหมดให้ libs คณิตศาสตร์ (MKL, SunPerf, ACML, ESSL และอื่น ๆ ) คุณควรใช้ libs มาตรฐานให้มากที่สุดเท่าที่จะเป็นไปได้แม้ว่าถ้าคุณใช้ Windows / Mac คุณอาจจะดีกว่ากับ C ที่ใช้การติดตั้ง Fortran compiler (gfortran) ฟรีสำหรับพวกเขานั่นก็คือจำนวนงานที่น้อยมาก
stali

ฉันใช้ lapack หลายครั้ง แต่ตอนนี้ฉันไม่ได้อยู่ในดินแดนของป้อมปราการ ฉันคาดหวังว่าการกระจายทางสถิติของแพลตฟอร์มที่ฐานผู้ใช้ของฉันทำงานจะคล้ายคลึงกับของโลกที่มีความหมายมากโดยเฉพาะอย่างยิ่ง windows, เปอร์เซ็นต์ของ macs และเปอร์เซ็นต์ * nix ที่น้อยลง ประสบการณ์ของฉันกับ windows นั้นน้อยมากและฉันชอบที่จะทำแบบนั้นต่อไป นี่คือเหตุผลที่ฉันต้องการรหัส C ++ แบบสแตนด์อะโลน ฉันคิดว่าฉันจะต้องให้ความช่วยเหลือแก่ผู้ใช้ของฉันในการรวบรวมและเรียกใช้รหัส ฉันต้องการลดงานที่ต้องทำให้น้อยที่สุด
jep

หากฐานผู้ใช้ของคุณคือ Windows / Mac คุณควรใช้ C (หรือแม้กระทั่งเป็นของคุณเอง) อย่างง่าย แพคเกจที่ยากต่อการติดตั้งหรือขึ้นอยู่กับ 5 libs อื่น ๆ โดยเฉพาะเมื่อไม่มีที่เก็บไบนารีแพ็กเกจชั้นหนึ่ง (เช่น Debian) ที่มีอยู่จะปิดผู้ใช้ของคุณเป็นเวลานาน โปรดจำไว้ว่าผู้ใช้ Windows / Mac ส่วนใหญ่ใช้ในการติดตั้งเพียงคลิกเดียว ความง่ายดายในการใช้ชัยชนะทุกอย่างอื่น
stali

5

ข้อผิดพลาดแรก ๆ ที่หลายคนทำเมื่อเริ่มต้นใช้งานคอมพิวเตอร์คำนวณคือสมมติว่าคุณต้องเขียนโค้ดทั้งหมดในภาษาเดียวกัน ฉันคิดว่านี่เป็นเพราะเหตุผลทางประวัติศาสตร์ส่วนใหญ่เมื่อมันไม่ชัดเจนว่าจะทำให้โปรแกรมที่คอมไพล์สื่อสารกับกันและกันข้ามเวอร์ชั่นคอมไพเลอร์เดียวกันได้อย่างไร ดังที่กล่าวไว้ในกรณีนี้ถ้าคุณกำลังจะใช้ C ++ อยู่ดีมีเทมเพลตเฉพาะส่วนหัว C ++ ที่ดีมากที่อาจตอบสนองความต้องการของคุณ

เนื่องจากคุณกำลังกระจายรหัสของคุณด้วยเหตุผลทางวิชาการและคุณต้องการที่จะฝังหนาแน่นเชิงเส้นพีชคณิตแก้เป็นรหัสของคุณผมจะขอแนะนำว่าคุณควรพิจารณาEigen Eigen ได้รับใบอนุญาตภายใต้ Mozilla Public License และเป็นห้องสมุดเฉพาะส่วนหัว ซึ่งหมายความว่าคุณสามารถแจกจ่าย Eigen ด้วยรหัสของคุณในรูปแบบแหล่งที่มา (ซึ่งไม่ได้กำหนดข้อ จำกัด สิทธิ์การใช้งานบนรหัสของคุณ) และคุณจะได้รับการเข้าถึงความสามารถทั่วไปรวมถึงตัวแก้เชิงเส้นหนาแน่นที่มีประสิทธิภาพสูงมาก ในฐานะที่เป็น GertVdE กล่าวถึงคุณมีตัวเลือกอื่น


ฉันหวังว่าจะมีไฟล์เดียว ฉันได้เขียนโปรแกรมวิทยาศาสตร์มาระยะหนึ่งแล้ว ฉันมีภาษาผสมเช่น C และ fortran ค่อนข้างน้อย แต่สำหรับโครงการนี้ฉันแค่ต้องการไฟล์เดียวที่มีซอร์สโค้ดของฉันทั้งหมด ฉันคิดว่าฉันสามารถใส่ตัวแก้ตัว C ในรหัส C ++ ซึ่งจะไม่เป็นเรื่องใหญ่ ส่วนใหญ่ฉันต้องการเก็บรหัสให้ง่ายที่สุด LU ที่มีการหมุนได้ควรเพียงพอ ฉันจะดู Eigen ขอบคุณ!
jep

@ jep คุณสามารถลองใช้เชอร์รี่เพื่อเลือกกิจวัตรที่คุณต้องการจากCLAPACKถ้าคุณไม่สนใจเกี่ยวกับการแสดง
Aron Ahmadia

มีเหตุผลที่ดีสำหรับการเขียนโค้ดที่ต้องพึ่งพาทั้งหมดในภาษาเดียวกันโดยเฉพาะในสภาพแวดล้อม HPC คุณมีปัญหาเกี่ยวกับคอมไพเลอร์ / การเชื่อมโยงและปัญหาอินเตอร์เฟซแบบ 32/64 บิต ตัวอย่างเช่นฉันจะทราบความกว้างของจำนวนเต็มสำหรับไลบรารีในตัวได้อย่างไร ฉันจะรู้ได้อย่างไรว่าคอมไพเลอร์ตัวใดที่ใช้สำหรับไลบรารีในตัวและฉันสามารถลิงค์กับคอมไพเลอร์อื่นได้หรือไม่ การมีทุกสิ่งในภาษาเดียวช่วยลดความยุ่งยากของปัญหาเหล่านี้ และใช่ควรมีเอกสารจัดทำโดยผู้ดูแลคลัสเตอร์ แต่ส่วนใหญ่ไม่มี
Victor Liu

@VictorLiu - ปัญหาที่คุณอ้างถึงนั้นแน่นแฟ้นกว่าการใช้งานมากกว่าภาษา พื้นที่ความคิดเห็นเป็นสถานที่ที่ไม่ดีสำหรับการพูดคุยอย่างจริงจัง แต่ฉันมีความสุขที่ได้มีส่วนร่วมกับคุณในการแชทหรือที่อื่น ๆ หากคุณต้องการให้ฉันขยายความคิดเกี่ยวกับเรื่องนี้
Aron Ahmadia

4

หากคุณต้องการแก้ที่เชื่อถือได้สำหรับระบบสมการเชิงเส้นฉันจะแนะนำFLENS มันมีการนำ LAPACK ไปใช้งานอีกครั้งอย่างแม่นยำ (แม้จะทำซ้ำข้อผิดพลาด roundoff เช่นเดียวกับ LAPACK หากใช้ BLAS แบบเธรดเดียว) สิ่งนี้เป็นจริงสำหรับทุกฟังก์ชั่นFLENS-LAPACK (พร้อมกับฟังก์ชั่นยูทิลิตี้ประมาณ 100 กิจวัตร)

FLENS อยู่ภายใต้ใบอนุญาต BSD และอนุญาตให้รวมอยู่ในผลิตภัณฑ์ที่เป็นกรรมสิทธิ์

FLENS เป็นส่วนหัวเท่านั้นและหากคุณต้องการชุดย่อยของ FLENS เท่านั้นฉันสามารถให้รุ่นที่แยกลงมาซึ่งมีเฉพาะฟังก์ชันที่คุณต้องการ FLENS มาพร้อมกับการใช้ BLAS อ้างอิงของตัวเอง แต่ผู้ใช้ของคุณสามารถเลือกที่จะเชื่อมโยงกับห้องสมุด BLAS ที่ได้รับการปรับปรุงเช่น ATLAS, OpenBLAS หรือ GotoBALS สำหรับเมทริกซ์ขนาดใหญ่จะให้ประสิทธิภาพที่เพิ่มขึ้นประมาณ 40% เมื่อเทียบกับ Eigen

และใช่ Eigen ยังใช้ชุดทดสอบ LAPACK เพื่อตรวจสอบผลลัพธ์ พวกเขาทำสิ่งนี้สำหรับ 3 ฟังก์ชั่น (Lu, Cholesky และ Eigenvalues ​​/ -vector ของเมทริกซ์สมมาตร) อย่างไรก็ตามการคำนวณค่าลักษณะเฉพาะ / -vector ของเมทริกซ์ที่ไม่สมมาตรจะทำให้ชุดทดสอบ LAPACK ล้มเหลว

ข้อจำกัดความรับผิดชอบ: ใช่ FLENS คือลูกของฉัน! นั่นหมายความว่าฉันเขียนโค้ดประมาณ 95% ของโค้ดนั้นและโค้ดทุกบรรทัดก็คุ้มค่า


1
ไมเคิล - โปรดพิจารณานี้เป็นคำเตือนที่เป็นมิตรที่คุณจะต้องทำตามกฎในคำถามที่พบบ่อยเกี่ยวกับการเปิดเผยข้อมูลการติดต่อ
Aron Ahmadia

แน่นอน แต่คุณยังสามารถโพสต์ข้อความของคุณใหม่จาก 'ฉันขอแนะนำให้คุณพิจารณา Eigen' เป็นอย่างเช่น 'มีตัวอย่าง Eigen' ในกรณีนี้ฉันลบคำพูดของฉันเกี่ยวกับ Eigen (แม้ว่าทั้งหมดจะได้รับการพิสูจน์ว่าเป็นจริง) รวมถึงสิ่งนี้
Michael Lehn

1
คำพูดของคุณเกี่ยวกับ Eigen ไม่ได้มีปัญหาที่นี่ (แม้ว่าพวกเขาจะดูนอกเรื่องสำหรับฉัน) คุณเป็นผู้พัฒนาหลักของ FLENS หากคุณจะแนะนำในคำตอบที่นี่คุณจะต้องเปิดเผยความร่วมมือของคุณในฐานะผู้พัฒนาโครงการ
Aron Ahmadia

อ่าโอเคแล้ว ฉันคิดว่ามันชัดเจนโดยปริยายโดย '... ฉันสามารถให้คุณ ... ' การเปิดเผยในแบบฟอร์มนี้ตกลงหรือไม่
Michael Lehn

2
ฉันแค่อยากจะบอกว่าขอบคุณที่ทำสิ่งนี้; ฉันมีแผนที่คล้ายกันที่จะนำ Lapack มาใช้ใหม่ใน C ++ อย่างไรก็ตามดูเหมือนว่าสำหรับงานประจำขั้นสูง (eigenvalue) ส่วนใหญ่คุณเพียงแค่โทรไปที่ Lapack ดังนั้นมันเป็นการโฆษณาที่ผิดเล็กน้อยที่จะบอกว่าคุณนำสิ่งนี้ไปใช้ทั้งหมด ในทางกลับกันฉันได้ย้ายแหล่ง ZGEEV ไปยัง C ++ ในRNPจริง ๆ แล้วถึงแม้ว่าบางส่วนจะยังอยู่ในการจัดทำดัชนีที่ใช้ 1 จากการแปลงอัตโนมัติ
Victor Liu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.