Tôi có cùng một vấn đề và tôi thấy rằng không có cách nào thực sự tốt để tự động nhận được tự động có điều kiện sử dụng trình biên dịch MPI cho các mục tiêu cụ thể.Autotools có ích khi tìm ra trình biên dịch nào sử dụng dựa trên ngôn ngữ mà nguồn của bạn được viết bằng (CC
, CXX
, FC
, F77
, v.v.), nhưng thực sự không giỏi để tìm hiểu xem có sử dụng trình biên dịch MPI hay không một mục tiêu cụ thể. Bạn có thể thiết lập MPICC, MPICXX, vv, nhưng về cơ bản bạn phải viết lại tất cả các quy tắc Makefile cho mục tiêu của mình (như bạn đã làm ở trên) nếu bạn sử dụng trình biên dịch theo cách này. Nếu bạn làm điều đó, điểm viết một tập tin tự động là gì?
Người khác đề xuất sử dụng MPI như thư viện bên ngoài và đây là cách tiếp cận tôi ủng hộ, nhưng bạn không nên làm điều đó bằng tay, bởi vì các cài đặt MPI khác nhau có các bộ cờ khác nhau mà chúng chuyển đến trình biên dịch và chúng có thể phụ thuộc vào ngôn ngữ bạn đang biên soạn.
Điều tốt là tất cả các trình biên dịch MPI hiện đang vận chuyển mà tôi biết về các đối số introspection hỗ trợ, như -show
, -show-compile
hoặc -show-link
. Bạn có thể tự động trích xuất các đối số từ các tập lệnh. Vì vậy, những gì tôi đã làm để đối phó với điều này là để thực hiện một tập lệnh m4
trích xuất các định nghĩa, bao gồm, đường dẫn thư viện, libs và cờ liên kết từ trình biên dịch MPI, sau đó gán chúng cho các biến bạn có thể sử dụng trong Makefile.am
của bạn . Đây là tập lệnh:
lx_find_mpi.m4
Điều này làm cho MPI hoạt động theo cách tự động mong đợi. Ngẫu nhiên, đây là cách tiếp cận CMake sử dụng trong mô-đun FindMPI
của họ và tôi thấy nó hoạt động khá tốt ở đó. Nó làm cho việc xây dựng nhiều thuận tiện hơn vì bạn chỉ có thể làm điều gì đó như thế này cho các mục tiêu của bạn:
bin_PROGRAMS = mpi_exe seq_exe
# This is all you need for a sequential program
seq_exe_SOURCES = seq_exe.C
# For an MPI program you need special LDFLAGS and INCLUDES
mpi_exe_SOURCES = mpi_exe.C
mpi_exe_LDFLAGS = $(MPI_CXXLDFLAGS)
INCLUDES = $(MPI_CXXFLAGS)
Có cờ tương tự cho các ngôn ngữ khác từ đó, như tôi đã nói, những lá cờ nói riêng và các thư viện có thể khác nhau tùy thuộc vào trình biên dịch MPI của ngôn ngữ mà bạn sử dụng.
lx_find_mpi.m4
cũng đặt một số biến trình bao để bạn có thể kiểm tra trong tệp configure.ac
cho dù có tìm thấy MPI hay không. ví dụ: nếu bạn đang tìm kiếm hỗ trợ MPI C++, bạn có thể kiểm tra $have_CXX_mpi
để xem macro có tìm thấy nó hay không.
Tôi đã thử nghiệm macro này với mvapich và OpenMPI, cũng như triển khai MPICH2 tùy chỉnh trên BlueGene máy (mặc dù nó không giải quyết tất cả các vấn đề biên dịch chéo bạn sẽ thấy ở đó). Hãy cho tôi biết nếu một cái gì đó không hoạt động. Tôi muốn giữ macro càng mạnh càng tốt.
Bạn có quan tâm nếu chương trình nối tiếp được liên kết chống lại các thư viện MPI trong "xây dựng cả hai" trường hợp? Nếu không, bạn chỉ có thể sử dụng mpicxx cho cả hai - nó không giống như nó sẽ làm tổn thương bất cứ điều gì. Và nếu bạn không xây dựng phiên bản mpi, bạn có thể đặt sử dụng g ++ cho mọi thứ. Theo kinh nghiệm, đây là những gì mà rất nhiều gói có cả hai phiên bản song song và nối tiếp dường như làm - hdf5 đến với tâm trí. –
Nói chung, không, và tôi đã sử dụng để biên dịch theo cách này. Tôi phát triển một số công cụ PMPI, và nói chung bạn không muốn liên kết một thư viện đánh chặn với MPI, mà bạn buộc phải làm nếu bạn biên dịch với mpicc. – tgamblin