ผู้ใช้ต้องการคุณลักษณะอะไรบ้างจากอินเทอร์เฟซ MPI C ++


28

เวอร์ชัน 3.0 ของมาตรฐาน MPI ลบอินเตอร์เฟส C ++ อย่างเป็นทางการ (ก่อนหน้านี้เลิกใช้แล้ว) ในขณะที่การใช้งานอาจยังคงสนับสนุนคุณสมบัติที่ใหม่ใน MPI-3 ไม่มีอินเตอร์เฟส C ++ ที่กำหนดในมาตรฐาน MPI ดูhttp://blogs.cisco.com/performance/the-mpi-c-bindings-what-happened-and-why/สำหรับข้อมูลเพิ่มเติม

แรงจูงใจในการลบอินเทอร์เฟซ C ++ ออกจาก MPI คือมันไม่มีค่าใดที่มีนัยสำคัญเหนืออินเตอร์เฟส C มีความแตกต่างน้อยมากนอกเหนือจาก "s / _ / :: / g" และคุณลักษณะหลายอย่างที่ผู้ใช้ C ++ ไม่คุ้นเคยเคยใช้ (เช่นการกำหนดประเภทอัตโนมัติผ่านเทมเพลต)

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

และใช่ฉันคุ้นเคยกับ Boost :: MPI ( http://www.boost.org/doc/libs/1_54_0/doc/html/mpi.html ) แต่มันรองรับคุณสมบัติ MPI-1 เท่านั้นและรูปแบบการทำให้เป็นอนุกรมจะเป็น ยากมากที่จะสนับสนุน RMA

อินเทอร์เฟซ C ++ หนึ่งตัวสำหรับ MPI ที่ฉันชอบก็คือของ Elemental ( https://github.com/poulson/Elemental/blob/master/src/core/imports/mpi.cpp ) ดังนั้นผู้คนอาจจะสามารถให้ความช่วยเหลือได้ เข้าใกล้ โดยเฉพาะอย่างยิ่งฉันคิดว่า MpiMap แก้ปัญหาที่สำคัญ


ฉันไม่คิดว่านี่เป็นสถานที่ที่เหมาะสมสำหรับคำถามดังกล่าว
Jack Poulson

คุณให้เหตุผลบางอย่างกับเรื่องนั้นได้ไหม คำถาม MPI จำนวนมากในเว็บไซต์นี้แนะนำให้ฉันทราบว่าผู้คนที่นี่พร้อมที่จะตอบคำถามนี้ นอกจากนี้ 0.2 upvotes ต่อนาทีแนะนำให้คนอื่นไม่เห็นด้วยกับการประเมินของคุณ ไม่ว่าในกรณีใดมันจะมีประโยชน์มากกว่าถ้าคุณแนะนำสถานที่อื่นให้โพสต์สิ่งนี้หากคุณไม่ชอบสถานที่ปัจจุบัน
Jeff

คำถามเป็นคำถามที่มีค่าและฉันคิดว่ามันอาจได้รับการตอบสนองที่มีคุณค่าในรายการส่งจดหมายวิทยาศาสตร์การคำนวณที่กว้างขึ้นหากอยู่ในขอบเขตที่นั่น (อาจเป็นข้อมูลย่อย, SIAM-CSE หรือแม้แต่โพสต์สาธารณะใน G +?) คำถามนี้อาจไม่เหมาะสำหรับไซต์ Stack Exchange เนื่องจากเป็นแบบอัตนัย (ดูscicomp.stackexchange.com/help/dont-ask ) . ตราบใดที่คำตอบเป็นรูปธรรมและมุ่งเน้นไปที่กรณีการใช้งานเฉพาะ (โดยไม่ต้องทำซ้ำหรือซ้อนทับกันอย่างมีนัยสำคัญ) ฉันคิดว่ามันคุ้มค่าที่จะเปิด
Geoff Oxberry

@Jeff: คำถามตรงข้ามกับแบบสำรวจความคิดเห็นสำหรับฉัน ฉันไม่ได้โต้แย้งว่ามันมีค่า แต่ฉันไม่เห็นว่ามีคำตอบที่ยอมรับได้ คำถามดังกล่าวจะไม่ธรรมดาสำหรับฟอรัม MPI หรือไม่
Jack Poulson

@ JackPoulson ฉันไม่ต้องการรู้ว่าผู้ดำเนินการคิดว่าอะไรคือคำตอบที่ถูกต้อง ฉันต้องการที่จะรู้ว่าสิ่งที่นักวิทยาศาสตร์ต้องการคำนวณ ในแง่นี้คำถามมีคำตอบที่เป็นวัตถุประสงค์ ไม่มีคำตอบที่ถูกต้อง แต่นั่นไม่ได้หมายความว่ามันเป็นสถานการณ์ส่วนตัว
เจฟฟ์

คำตอบ:


17

ก่อนอื่นให้ฉันตอบว่าทำไมฉันคิดว่าอินเทอร์เฟซ C ++ กับ MPI โดยทั่วไปไม่ประสบความสำเร็จมากเกินไปโดยคิดเกี่ยวกับปัญหามาเป็นเวลานานเมื่อพยายามตัดสินใจว่าเราควรใช้มาตรฐาน C ของ MPI หรือสร้างสิ่งที่ระดับสูงขึ้น :

เมื่อคุณดูรหัส MPI ในโลกแห่งความจริง (เช่น PETSc หรือในกรณีของฉันข้อตกลง II) หนึ่งพบว่าอาจน่าแปลกใจจำนวนการโทร MPI ไม่ได้มีขนาดใหญ่มากจริง ๆ ตัวอย่างเช่นในสายการซื้อขาย 500k II มีการโทรเพียง ~ 100 MPI ผลที่ตามมาก็คือความเจ็บปวดที่เกี่ยวข้องกับการใช้อินเทอร์เฟซระดับล่างเช่นการผูก MPI C นั้นไม่ใหญ่เกินไป ในทางกลับกันเราจะไม่ได้อะไรมากมายจากการใช้อินเตอร์เฟสระดับสูง

ข้อสังเกตที่สองของฉันคือระบบจำนวนมากมีการติดตั้ง MPI หลายไลบรารี (การใช้งาน MPI ที่แตกต่างกันหรือรุ่นที่แตกต่างกัน) สิ่งนี้ก่อให้เกิดความยากลำบากอย่างมากหากคุณต้องการใช้พูดเพิ่ม :: mpi ที่ไม่เพียง แต่ประกอบด้วยไฟล์ส่วนหัว: อาจจำเป็นต้องมีการติดตั้งแพคเกจนี้หลายครั้งเช่นกันหรือต้องการสร้างเป็นส่วนหนึ่งของ โครงการที่ใช้ boost :: mpi (แต่นั่นเป็นปัญหาในตัวเองอีกครั้งเนื่องจากการเพิ่มนั้นใช้ระบบการสร้างของตัวเองซึ่งไม่เหมือนสิ่งอื่นใด)

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

ทั้งหมดนี้กล่าวว่านี่คือสิ่งที่ฉันคิดว่าน่าจะเป็นคุณสมบัตินักฆ่าที่ฉันต้องการจากอินเทอร์เฟซระดับสูงกว่า:

  • ควรเป็นแบบทั่วไป การระบุชนิดข้อมูลของตัวแปรนั้นไม่ใช่ C ++ อย่างแน่นอน แน่นอนมันยังนำไปสู่ข้อผิดพลาด คลาส MpiMap ของ Elemental จะเป็นขั้นตอนแรกที่ดีแล้ว (แม้ว่าฉันจะไม่สามารถเข้าใจได้ว่าทำไม heck MpiMap::typeตัวแปรจึงไม่ใช่ const const แบบคงที่เพื่อให้สามารถเข้าถึงได้โดยไม่ต้องสร้างวัตถุ)

  • มันควรจะมีสิ่งอำนวยความสะดวกสำหรับการสตรีมข้อมูลประเภทใดก็ได้

  • การดำเนินการที่ต้องมีการMPI_Opโต้แย้ง (เช่นการลดลง) ควรรวมเข้ากับstd::functionส่วนติดต่อของ C ++ เพื่อให้ง่ายต่อการผ่านตัวชี้ฟังก์ชั่น (หรือแลมบ์ดา!) แทนที่จะต้องลงทะเบียนอะไรอย่างงุ่มง่าม

boost :: mpi ทำให้พอใจกับสิ่งเหล่านี้ทั้งหมด ฉันคิดว่าถ้ามันเป็นห้องสมุดแบบหัวเท่านั้นมันจะเป็นที่นิยมมากขึ้นในทางปฏิบัติ มันจะช่วยได้ถ้ามันรองรับฟังก์ชั่น post-MPI 1.0 แต่เอาเถอะตรงนี้มันครอบคลุมถึงสิ่งที่เราต้องการเป็นส่วนใหญ่


หนึ่งในปัญหาเกี่ยวกับการทำให้เป็นอันดับใน Boost :: MPI คือมันไม่ทำงานกับด้านเดียว (aka RMA) คุณคิดว่าเป็นไปได้ไหมที่จะสร้าง MPI datatypes สำหรับวัตถุ C ++ ที่ผู้ใช้สนใจ? แน่นอนในทางทฤษฎีทุกอย่างควรได้รับการสนับสนุน แต่ฉันชอบที่จะเริ่มต้นด้วยเป้าหมายในทางปฏิบัติมากขึ้น
Jeff

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

สวัสดี Wolfgang คุณถูกต้องที่ MpiMap จะดูสง่างามกว่าหากใช้ตัวแปรสมาชิก const แบบคงที่ ฉันได้จัดระเบียบการนำไปใช้ใหม่: github.com/poulson/Elemental/commit/ …
Jack Poulson

ใช่ดีกว่ามาก :-)
Wolfgang Bangerth

+1 ประมาณไม่กี่คนที่โทร MPI @WolfgangBangerth พื้นฐานการพูด mpi ควรจะทำให้การคำนวณเร็วขึ้นคุณต้องการลดการเรียกใช้ mpi ให้น้อยที่สุดเพราะค่าใช้จ่ายของคุณ!
ชาร์ลส์

6

เพื่อให้ได้ลูกบอลกลิ้งต่อไปนี้เป็นสองสิ่งที่ฉันต้องการ:

  • อินเทอร์เฟซควรจะสามารถกำจัดอาร์กิวเมนต์ที่ซ้ำซ้อนหรือไม่จำเป็นเช่น MPI_IN_PLACE
  • อินเทอร์เฟซควรตรวจหาชนิดข้อมูลที่มีอยู่แล้วภายในโดยอัตโนมัติของ MpiMap ของ Elemental
  • หาก / เป็นไปได้ควรมีการสร้างประเภทข้อมูลที่ผู้ใช้กำหนดสำหรับคลาส

5

รายการของฉันไม่มีลำดับที่เฉพาะเจาะจง อินเทอร์เฟซควร:

  • เป็นส่วนหัวเท่านั้นโดยไม่มีการอ้างอิงใด ๆ แต่<mpi.h>และไลบรารีมาตรฐาน
  • ทั่วไปและขยายออกได้
  • ไม่ใช่การปิดกั้นเท่านั้น (หากคุณต้องการบล็อกจากนั้นบล็อกอย่างชัดเจนไม่ใช่ค่าเริ่มต้น)
  • อนุญาตการโยงแบบต่อเนื่องของการดำเนินการที่ไม่ปิดกั้น
  • รองรับการขยายและการจัดลำดับอย่างมีประสิทธิภาพ (Boost.Fusion เช่นนั้นใช้งานได้กับ RMA)
  • มีโทษเป็นนามธรรมอย่างน้อย (กล่าวคืออย่างน้อยก็เร็วเท่าอินเตอร์เฟส C)
  • ปลอดภัย (ผู้ทำลายอนาคตที่ไม่พร้อมเรียกว่า? -> std :: ยุติ!),
  • มีDEBUGโหมดที่แข็งแกร่งด้วยการยืนยันมากมาย
  • พิมพ์ปลอดภัยมาก (ไม่มี ints / void * สำหรับทุกอย่าง heck ฉันต้องการแท็กเป็นแบบ!),
  • มันควรทำงานกับ lambdas (เช่นลด + lambda)
  • ใช้ข้อยกเว้นอย่างสม่ำเสมอเป็นกลไกการรายงานข้อผิดพลาดและการจัดการข้อผิดพลาด (ไม่มีรหัสข้อผิดพลาดอีกต่อไป!
  • MPI-IO ควรนำเสนออินเตอร์เฟส I / O ที่ไม่มีการบล็อกในรูปแบบของ Boost.AFIO
  • และปฏิบัติตามแนวทางการออกแบบอินเตอร์เฟส C ++ ที่ทันสมัย ​​(กำหนดประเภททั่วไปฟังก์ชั่นที่ไม่เป็นสมาชิกที่ไม่ใช่สมาชิกเล่นได้ดีกับซีแมนทิกส์ย้ายการดำเนินการช่วงที่รองรับ ... )

พิเศษ:

  • อนุญาตให้ฉันเลือกผู้ดำเนินการของสภาพแวดล้อม MPI นั่นคือเธรดพูลที่ใช้ ตอนนี้คุณสามารถมีแอปพลิเคชันที่มี OpenMP, MPI, CUDA และ TBB ... ทั้งหมดในเวลาเดียวกันโดยที่แต่ละ run-time คิดว่ามันเป็นเจ้าของสภาพแวดล้อมและขอให้ระบบปฏิบัติการใช้เธรดทุกครั้งที่รู้สึก มัน. อย่างจริงจัง?

  • ใช้หลักการตั้งชื่อ STL (และ Boost) ทำไม? โปรแกรมเมอร์ C ++ ทุกคนรู้ดี

ฉันต้องการเขียนโค้ดเช่นนี้:

auto buffer = some_t{no_ranks};
auto future = gather(comm, root(comm), my_offsets, buffer)
              .then([&](){
                /* when the gather is finished, this lambda will 
                   execute at the root node, and perform an expensive operation
                   there asynchronously (compute data required for load 
                   redistribution) whose result is broadcasted to the rest 
                   of the communicator */
                return broadcast(comm, root(comm), buffer);
              }).then([&]() {
                /* when broadcast is finished, this lambda executes 
                   on all processes in the communicator, performing an expensive
                   operation asynchronously (redistribute the load, 
                   maybe using non-blocking point-to-point communication) */
                 return do_something_with(buffer);
              }).then([&](auto result) {
                 /* finally perform a reduction on the result to check
                    everything went fine */
                 return all_reduce(comm, root(comm), result, 
                                  [](auto acc, auto v) { return acc && v; }); 
              }).then([&](auto result) {
                  /* check the result at every process */
                  if (result) { return; /* we are done */ }
                  else {
                    root_only([](){ write_some_error_log(); });
                    throw some_exception;
                  }
              });

/* Here nothing has happened yet! */

/* ... lots and lots of unrelated code that can execute concurrently 
   and overlaps with communication ... */

/* When we now call future.get() we will block 
   on the whole chain (which might have finished by then!).
*/

future.get();

ลองคิดดูว่าเราจะเชื่อมโยงการปฏิบัติการทั้งหมดนี้โดยใช้ MPI_C requestได้อย่างไร คุณจะต้องทดสอบในหลาย ๆ ขั้นตอน (หรือทุก ๆ ครั้ง) ผ่านรหัสที่ไม่เกี่ยวข้องทั้งหมดจำนวนมากเพื่อดูว่าคุณสามารถเลื่อนสายของคุณโดยไม่ปิดกั้นหรือไม่


นี่คือรายการข้อกำหนดที่เข้มข้น ไม่กี่ของพวกเขาเป็นไปไม่ได้สำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมด (เช่นการสนับสนุน lambdas ในการลด) อย่างไรก็ตามโดยรวมแล้วฉันคิดว่าเป็นประเภทของสิ่งที่ชุมชน MPI ควรปรารถนาที่จะสนับสนุน
Jeff

สำหรับเธรดและสภาวะแวดล้อมรันไทม์ MPI จะใช้เธรดหรือเธรด OS (POSIX, Windows หรือ Solaris ขึ้นอยู่กับระบบปฏิบัติการ) ภายใน ฉันค่อนข้างแน่ใจว่าฉันเข้าใจข้อกำหนดที่นี่
เจฟฟ์

ปัญหาคือ MPI สามารถร้องขอเธรดโดยพลการจากระบบปฏิบัติการ แอปพลิเคชันของฉันมีเธรดพูลและฉันต้องการ MPI เพื่อร้องขอเธรดเหล่านั้นจากเธรดพูลของฉัน ขณะนี้ไม่สามารถทำได้ (และโดยทั่วไปจะไม่เป็นปัญหา) ยกเว้นว่าคุณมีแอปพลิเคชันที่ใช้ OpenMP, TBB และ MPI แต่ละตัวมีเธรดพูลของตัวเองแต่ละตัวมีจำนวนคอร์ 4x จำนวน
gnzlbg

1
MPI สามารถทำได้ แต่โดยทั่วไปจะไม่ใช้เธรด OS ภายใน ในทุกกรณีที่ฉันคุ้นเคย (MPICH (2), MVAPICH2, OpenMPI, CrayMPI) มีเพียงตัวเลือกรันไทม์ที่จัดเตรียมโดยผู้ใช้ทำให้สิ่งนี้เกิดขึ้นนั่นคือค่าเริ่มต้นไม่ได้เป็นเช่นนั้น Blue Gene / Q MPI เป็นข้อยกเว้น แต่ในรูปแบบดังกล่าวซึ่งไม่เกี่ยวข้องกับการสนทนานี้
Jeff

ขอบคุณ @ เจฟฟ์! คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับวิธีที่ MPI จัดการการโทรที่ไม่บล็อกหลายสายขณะใช้งานเธรดเดียวได้หรือไม่? มันใช้ coroutines / หัวข้อสีเขียว / เส้นใย?
gnzlbg

2

โดยส่วนตัวแล้วฉันไม่รังเกียจที่จะเรียกฟังก์ชั่น C-style แบบยาว ๆ เพราะเหตุผลที่ Wolfgang พูดถึง; มีสถานที่เพียงไม่กี่แห่งที่คุณจำเป็นต้องโทรหาพวกเขาและถึงแม้ว่าพวกเขามักจะถูกห่อหุ้มด้วยโค้ดระดับสูงกว่า

สิ่งเดียวที่ทำให้ฉันรำคาญกับ C-style MPI คือประเภทข้อมูลที่กำหนดเองและการดำเนินการที่กำหนดเองในระดับที่น้อยกว่า (เพราะฉันใช้บ่อยกว่า) สำหรับประเภทข้อมูลที่กำหนดเองฉันจะบอกว่าอินเทอร์เฟซ C ++ ที่ดีควรสามารถสนับสนุนวิธีการทั่วไปและมีประสิทธิภาพในการจัดการสิ่งนี้ส่วนใหญ่อาจผ่านการทำให้เป็นอนุกรม แน่นอนว่านี่เป็นเส้นทางที่boost.mpiใช้ซึ่งถ้าคุณระวังจะเป็นการประหยัดครั้งใหญ่

สำหรับboost.mpiการมีการพึ่งพาพิเศษ (โดยเฉพาะอย่างยิ่งboost.serializationที่ไม่ได้เป็นเพียงส่วนหัวเท่านั้น) เมื่อเร็ว ๆ นี้ฉันได้เจอไลบรารี่ซีเรียลไลเซชันเฉพาะซีพลัสพลัสที่เรียกว่าซีเรียลซึ่งดูเหมือนว่ามีแนวโน้ม ได้รับมันต้องมีคอมไพเลอร์ที่เข้ากันได้กับ C ++ 11 boost.mpiมันคุ้มค่าอาจจะมองเข้าไปในและใช้เป็นพื้นฐานสำหรับสิ่งที่คล้ายกับ


โปรดทราบว่าฉันไม่จำเป็นต้องมองหาสิ่งที่จะใส่ในมาตรฐาน MPI ฉันเห็นด้วยอย่างสมบูรณ์ว่า MPI ควร "ห่อตัวด้วยรหัสระดับสูงกว่า" ดังนั้นสิ่งที่ฉันสงสัยก็คือรหัสระดับสูงนั้นมีหน้าตาเป็นอย่างไร องค์ประกอบมีวิธีการที่ดี แต่ดีที่สุดสำหรับทุกกรณีหรือไม่ ถ้าใครอยากมีอินเทอร์เฟซ C ++ กับ MPI ที่พยายามทำให้คนจำนวนมากมีความสุขมันจะเป็นอย่างไร
Jeff

@ Jeff สำหรับฉัน: 1. ฉันชอบส่งข้อมูลแบบกำหนดเองได้อย่างง่ายดาย 2. ฉันชอบที่จะสามารถลดการดำเนินการด้วยการดำเนินการที่กำหนดเองได้อย่างง่ายดาย นอกจากนี้ผมคิดว่า 1 ผมพลิ้วไหวความสำคัญมากขึ้น / มีประโยชน์กว่า 2
GradGuy

ฉันไม่เห็นว่า C ++ ทำอะไรเวทมนต์ wrt (2) คุณคิดอะไรอยู่ที่นี่
Jeff

@Jeff ฉันกำลังคิดบางอย่างตามวิธีthrustการลด: docs.thrust.googlecode.com/hg/group__reductions.html
GradGuy

-1

โครงการ github easyLambdaมอบอินเตอร์เฟสระดับสูงให้กับ MPI ด้วย C ++ 14

ฉันคิดว่าโครงการมีเป้าหมายที่คล้ายกันและมันจะให้ความคิดบางอย่างเกี่ยวกับสิ่งที่สามารถและจะทำในพื้นที่นี้โดยใช้ C ++ ที่ทันสมัย ชี้แนะความพยายามอื่น ๆ เช่นเดียวกับ easyLambda

มาตรฐานเริ่มต้นเกี่ยวกับประสิทธิภาพและบรรทัดของรหัสได้แสดงผลลัพธ์ที่มีแนวโน้ม

ป้อนคำอธิบายรูปภาพที่นี่

ต่อไปนี้เป็นคำอธิบายสั้น ๆ เกี่ยวกับคุณสมบัติและส่วนต่อประสานที่มีให้

อินเทอร์เฟซขึ้นอยู่กับการเขียนโปรแกรมการไหลของข้อมูลและการดำเนินงานรายการที่ให้ขนานกัน การขนานจะแสดงเป็นคุณสมบัติของงาน การจัดสรรกระบวนการและการกระจายข้อมูลสำหรับงานสามารถร้องขอได้ด้วยคุณสมบัติ. prll () มีตัวอย่างจำนวนมากในหน้าเว็บและที่เก็บรหัสซึ่งรวมถึงการประมวลผลการโพสต์ของโมเลกุล LAMMPS การแก้ปัญหาความแตกต่างที่ชัดเจนของสมการความร้อนการถดถอยโลจิสติก ฯลฯ เป็นตัวอย่างปัญหาการแพร่กระจายความร้อนที่กล่าวถึงในบทความHPCสามารถแสดงในรหัส ~ 20 บรรทัด

ฉันหวังว่าจะเป็นเรื่องดีที่จะให้ลิงก์แทนที่จะเพิ่มรายละเอียดและรหัสตัวอย่างเพิ่มเติมที่นี่

Disclamer: ฉันเป็นผู้แต่งห้องสมุด ฉันเชื่อว่าฉันไม่ได้ทำอันตรายใด ๆ โดยหวังว่าจะได้รับข้อเสนอแนะที่สร้างสรรค์ในอินเทอร์เฟซปัจจุบันของ easyLambda ซึ่งอาจเป็นประโยชน์ต่อ easyLambda และโครงการอื่น ๆ ที่ดำเนินการตามเป้าหมายที่คล้ายกัน


คำถามกล่าวว่า " เรากำลังมองหาคำตอบยาว ๆ ที่ให้คำอธิบายและบริบทไม่เพียงแค่ให้คำตอบแบบบรรทัดเดียวอธิบายว่าทำไมคำตอบของคุณถึงถูกต้องเหมาะสมกับการอ้างอิงคำตอบที่ไม่รวมคำอธิบายอาจถูกลบออก . " ทำไมคุณคิดว่าคำตอบของคุณสมบูรณ์เพียงพอที่จะอธิบายคำอธิบายนี้
nicoguaro

ฉันกำลังชี้ไปยังโครงการที่ให้อินเทอร์เฟซที่คล้ายกับสิ่งที่ OP ขอ ฉันสามารถให้รายละเอียดของแรงจูงใจและคุณสมบัติของโครงการในคำตอบของตัวเองและให้ OP และคนอื่น ๆ อ่านและแนะนำสิ่งที่พวกเขาคิดเกี่ยวกับมัน อย่างไรก็ตามฉันเลือกที่จะให้ลิงก์เท่านั้น ฉันเข้าใจประเด็นของคุณ ให้ฉันเพิ่มข้อความที่มีการอ้างอิงถึงคำตอบ
Utkarsh Bhardwaj

@UtkarshBhardwaj: ความเห็นบางส่วน: (1) ขอบคุณที่เขียนไลบรารีที่เชื่อมต่อ C ++ กับ MPI มันเป็นภารกิจที่สำคัญและดูเหมือนว่าคุณได้ทุ่มเทงานลงไปมากมาย (2) อ่านเอกสารอย่างรวดเร็ว (อีกครั้งเป็นงานที่ดี) สิ่งที่โดดเด่นคือโซ่ยาวของคำสั่งวิธีการที่ใช้ซึ่งดูเหมือนว่าโวหาร ... เจ็บปวดที่จะแก้ไขข้อบกพร่องแม้ว่าคุณจะจัดรูปแบบไว้อย่างดีก็ตาม (3) abstractions เข้าใจกระบวนทัศน์การทำงานซึ่งมีประโยชน์สำหรับงานที่คล้ายกับการลดแผนที่ แต่ในฐานะคนที่โปรแกรมใน MPI ฉันไม่ต้องการทำงานซ้ำอัลกอริทึมของฉันและเคลื่อนย้ายมากเกินไปจากอินเทอร์เฟซที่ฉันรู้จัก
Geoff Oxberry

(4) ฉันไม่เห็นผู้สื่อสารที่ไหนเลยในตัวอย่างซึ่งทำให้ฉันสงสัยว่าคุณกำลังใช้ MPI_COMM_WORLD สำหรับทุกสิ่งและ จำกัด ศักยภาพของห้องสมุดของคุณ (5) abstractions ดูเหมือนจะสร้างบน abstractions MPI และอาจมีแบ็กเอนด์ที่แตกต่างกัน (6) อิงจาก (3) - (5) ฉันไม่คิดว่าไลบรารีนี้เป็นอินเทอร์เฟซ MPI และฉันเชื่อว่าความคิดเห็นนี้เป็นแบบนอกหัวข้อ
Geoff Oxberry

@ Geoff ขอบคุณสำหรับข้อเสนอแนะที่มีคุณค่าขอบคุณมาก ตอบกลับไปยังจุดที่เฉพาะเจาะจง: 2) การผูกมัดบางครั้งเรียกว่าเป็นExpressionBuilder มันเป็นวิธีการทั่วไปของการแสดงองค์ประกอบในสไตล์การทำงาน ไม่จำเป็นต้องเขียนในลักษณะนี้ใน ezl เป็นไปได้ที่จะเขียนแต่ละหน่วยก่อนจากนั้นจึงเขียนมันตรวจสอบ [ตัวอย่าง] ( goo.gl/YzaL0k ) 3) ฉันรู้ว่ามันเป็นเรื่องยากที่จะไปจากการควบคุมการไหลและความจำเป็นในการไหลของข้อมูลและการทำงาน แต่ละคนมีข้อดีข้อเสีย อย่างไรก็ตามฉันเชื่อว่าสิ่งหลังจำเป็นต้องได้รับการสำรวจเพิ่มเติมเพื่อให้ทราบถึงประสิทธิภาพที่แท้จริงของมัน
Utkarsh Bhardwaj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.