Tôi có nên chuyển đối số dòng lệnh cho MPI_Init hay không?


8

Khi viết mã MPI 3.0, tôi có nên chuyển argcargvthực hiện MPI_Initcuộc gọi hay không, và tại sao?

EDIT: Vì câu trả lời của Bill Barth đã đưa ra một số câu hỏi tôi muốn đưa ra một số nhận xét:

  • Đạt argc/ argvkhông bắt buộc kể từ MPI 1.1.
  • Câu hỏi cụ thể là tại sao nên / không nên vượt qua argc/ argv( tại sao bạn không thực sự không phải là một câu trả lời).
  • Tuy nhiên, đôi khi bạn không thể chuyển argc/ argvđến MPI_Init(viết thư viện sử dụng khởi tạo tĩnh để khởi động MPI nếu chính nằm ngoài tầm kiểm soát của bạn và MPI là một chi tiết triển khai).

EDIT2: Câu hỏi tại sao bạn không sử dụngMPI_Init(argc, argv) đã đến quá thường xuyên bây giờ. Một số lý do:

  • Không thể thực hiện vì mục đích tương thích với các triển khai MPI <1.1 cũ hơn / không tuân thủ / tuân thủ <1.1 nếu bạn đang sử dụng MPI2 hoặc MPI3, những tính năng này sẽ không hoạt động.

  • MPI_Init() khởi tạo thời gian chạy MPI theo cách tương tự như MPI_Init(argc, argv)

  • MPI_Init(argc, argv)loại bỏ lập luận truyền cho Bộ KH & ĐT thời gian chạy từ argc, và argv khởi MPI. AFAIK đó là cách duy nhất để làm sạch argcargvvì vậy nếu bạn cần những thứ này để không có đối số MPI, bạn cần sử dụng nó.

  • MPI_Init()có thể được sử dụng trong nhiều tình huống đó MPI_Init(argc, argv). Ví dụ, thư viện của bạn sử dụng MPI làm chi tiết triển khai có thể kiểm tra xem MPI có được khởi tạo không, và nếu không, hãy gọi MPI_Init()và điều đúng sẽ xảy ra. Người dùng của bạn không biết rằng bạn đang sử dụng mpi, không cần phải vượt qua argc, argvđến thư viện của bạn, không cần thay đổi chính của họ (trong trường hợp không có đối số) để sử dụng thư viện của bạn ....


Tôi không theo dõi lý do tại sao câu trả lời của BillBarth không trả lời câu hỏi của bạn. Phần "tại sao bạn không" có vẻ như tổng hợp ý chính của câu trả lời của anh ấy, mô tả những gì đã xảy ra với các triển khai MPI trước đó và tại sao việc không truyền các đối số có thể gây ra vấn đề. Có lẽ bạn đang tìm kiếm một cái gì đó dứt khoát hơn?
Geoff Oxberry

@GeoffOxberry Vấn đề với lý do tại sao bạn không trả lời là nó tốt như lý do tại sao bạn sẽ trả lời. Vì tất cả các triển khai Bộ KH & ĐT hỗ trợ MPI> 1.1 đã cung cấp giải pháp thay thế MPI_Init()có để có được một cách chính xác các đối số bạn vượt qua để mpirun/ mpiexec bằng cách nào đó (nó là không xác định như thế nào), và kể từ khi MPI_Init()có thể được sử dụng trong các tình huống hơn MPI_Init(argc, argv)(và không có cách giải quyết), I don' Tôi thực sự thấy được vấn đề khi sử dụng MPI_Init(argc, argv)nếu bạn đang nhắm mục tiêu MPI 3.0.
gnzlbg

Không thể tương thích với các triển khai MPI hỗ trợ MPI <1.1 nếu bạn phải sử dụng các tính năng MPI 2.0 hoặc MPI 3.0.
gnzlbg

2
Bạn vẫn còn thiếu điểm cơ bản của tôi. Phân phối MPI không thể cho biết tại thời điểm thực hiện liệu MPI_Init của bạn có vượt qua NULL hay không, vì vậy nó có thể đặt nội dung lên dòng lệnh. Nếu bạn không vượt qua argc và argv, thì MPI_Init không thể chỉnh sửa chúng để loại bỏ các bổ sung của nó, do đó mã của bạn sẽ phải mạnh mẽ đối với các đối số dòng lệnh giả từ MPI. Do đó, tại sao có nguy cơ phải xử lý một tập hợp các đối số tùy ý và có thể xung đột khi bạn có thể chuyển chúng cho MPI_Init và lấy lại một bộ sạch? Nếu bạn không thể, bạn không thể, nhưng bạn nên .
Bill Barth

Xem EDIT thứ hai cho câu hỏi. Về cơ bản nếu bạn muốn dọn dẹp argcargvtừ các đối số MPI khởi tạo MPI thì hãy sử dụng MPI_Init(argc, argv), nếu không thì MPI_Init()vẫn ổn (và đôi khi nó là cần thiết).
gnzlbg

Câu trả lời:


2

Tôi chắc chắn sẽ vượt qua chúng, nhưng tôi sẽ vượt qua các con trỏ như MPI_init (& argc, & argv) này, cho phép gọi MPI_init (NULL, NULL) trong hàm của bạn.


1

Tôi không biết liệu có gì mới trong tiêu chuẩn 3.0 khiến nó không bắt buộc trong C / C ++ để không vượt qua chúng hay không, nhưng tôi chắc chắn sẽ vượt qua chúng. Tôi không biết trạng thái hiện tại, nhưng trong quá khứ, nhiều triển khai đã chuyển các đối số dòng lệnh bổ sung cho chương trình của bạn khi được thực thi và sau đó chỉnh sửa chúng MPI_Init(). Nếu bạn muốn sử dụng các đối số dòng lệnh để truyền các tùy chọn cho chương trình của mình, nếu bạn không cho phép triển khai thực hiện chỉnh sửa, thì bạn sẽ phải giải thích cả đối số của mình và số lượng và kiểu đối số có thể chưa biết từ triển khai cụ thể bạn đang sử dụng. Các đối số này cũng có khả năng cao thay đổi từ thực hiện đến thực hiện.

Nó khá bình thường gọi MPI_Init()với argcargv, vì vậy tại sao không?


Thông số kỹ thuật nói rằng sau MPI 1.1 nếu bạn chuyển null sang MPI_Init, nó sẽ đọc các đối số từ môi trường. Vậy tại sao lại chuyển chúng vào ứng dụng của bạn ngay từ đầu nếu nó có thể đọc chúng từ môi trường? Nếu thời gian chạy vượt qua các đối số cho ứng dụng, thì có nghĩa là gọi MPI_Init với chúng sao cho ít nhất thời gian chạy của bạn làm sạch chúng trước khi phần còn lại của ứng dụng sử dụng chúng.
gnzlbg

OK, vậy bạn đã thử nghiệm mọi stack có sẵn để tìm hiểu xem họ có bắt kịp với những gì họ có thể làm không? Nếu có thể một số ngăn xếp có thể làm rối loạn phân tích đối số mã của bạn bằng cách thêm các đối số bổ sung, tại sao không để nó thực hiện phần của nó để loại bỏ các đối số bổ sung đó trong quá trình khởi tạo? Có hại gì khi truyền argc và argv cho MPI_Init ()? Một lần nữa, tại sao không làm điều đó?
Bill Barth

1
(1) Tôi thực sự không hiểu quan điểm của bạn về thông tin môi trường. Nếu tôi gọi mpirun/ mpiexecvới một số tham số, mpiruncó thể đặt một số biến môi trường trước khi bắt đầu chương trình của tôi, sau đó đọc chúng từ bên trong MPI_Init. (2) Tôi chưa thử nghiệm mọi triển khai có thể, nhưng như câu hỏi tôi chỉ quan tâm đến việc triển khai tuân thủ MPI 3.0. Không có nhiều thứ phức tạp .
gnzlbg

2
Tôi đã bỏ lỡ chỉnh sửa của bạn trước khi tôi gõ tất cả điều đó. Đề nghị của tôi là chuyển argc và argv đến thư viện nếu nó muốn khởi tạo MPI thay cho bạn. Điều đó, hoặc yêu cầu người dùng MPI_Init () và vượt qua thư viện trình truyền thông được yêu cầu. Có thể không thể gọi được MPI_Init () bằng argc và argv. Thú cưng, ví dụ, hỗ trợ cả hai phong cách.
Bill Barth

1
Hỗ trợ cả hai phong cách dường như là cần thiết cho bất cứ ai viết trình bao bọc MPI.
gnzlbg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.