Tôi có một đoạn mã lớn có lỗi MPI rất lạ. Song song hóa MPI là chuyện nhỏ, chỉ cần tính trung bình ở đâu đó trong mã của bạn, có thể tách biệt thành:
//Tuyên ngôn
std::vector cục bộ;
std::vector toàn cầu;
kích thước int không dấu;
/* ... những phép tính khổng lồ ở đây ... */
kích thước = 10000; // xấp xỉ
local.resize(size);
toàn cầu.resize (kích thước);
local.shrink_to_fit();
toàn cầu.shrink_to_fit();
/* ... một số thao tác để điền vào vectơ cục bộ ... */
MPI_Allreduce(local.data(), Global.data(), int(size),
MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
/* ... một số thao tác cuối cùng ở đây ... */
Nhưng nếu tôi vẽ global
Giá trị là khoảng 10
giá trị lỗi (hơn 10000
) được phân bố ngẫu nhiên trong vectơ (nhưng luôn ở dạng ~thứ 1000
Và ~thứ 2000
giữa các giá trị):
Không phải tất cả nhiệm vụ MPI đều giống nhau (~80% nhiệm vụ có cùng giá trị lỗi, nhưng ~20% còn lại có giá trị lỗi khác nhau)
Không giống nhau cho 2 lần chạy khác nhau (không thể lặp lại)
Tôi đã rồi 1
được sử dụng trên bộ xử lý valgrind
Đã chạy thử chương trình (vừa gỡ bỏ MPI_Init
,MPI_Allreduce
Và MPI_Hoàn thiện
) và không có rò rỉ bộ nhớ hoặc bất kỳ vấn đề nào (ít nhất đây là valgrind
đã nói với tôi).
Số lượng tác vụ bình thường cho phiên bản song song là1024
, chương trình đang diễn raC++11
Trung Quốc sử dụngg++4.8.1
.
Valgrind
Đó là hy vọng cuối cùng của tôi và tôi không biết chuyện gì đang xảy ra. Bất kỳ ý tưởng hoặc đề xuất đều được chào đón!
LƯU Ý: Vấn đề có thể không nằm ở chính mã (cấu hình MPI, phần cứng, v.v.), vì vậy mọi ý tưởng về nội dung cần kiểm tra đều được hoan nghênh.
Cho bạn biết, sau 2 ngày nghiên cứu, vấn đề hiện đã được giải quyết. MPI_Allreduce
Nếu kích thước bộ đệm không khớp, thay vì gặp sự cố, bạn sẽ có hành vi kỳ lạ. Tôi thấy rằng việc thay thế chúng bằng MPI_Giảm
+ MPI_Bcast
(Và MPI_Giảm
Sự cố do kích thước bộ đệm không khớp). Không thể tìm thấy lỗi chỉ bằng cách sử dụng thông tin được cung cấp trong câu hỏi: key online:
kích thước = 10000; // xấp xỉ
và lời nóikhoảng
Bởi vì trong mã thực của tôi, kích thước này dựa vào rất nhiều phép tính phương trình vi phân và tích phân số. Nhưng mã này sử dụng song song lai MPI+std::chủ đề
.và một phần của quá trình tích hợp dựa vào std::chủ đề
Chữ số cuối cùng của tích phân phụ thuộc vào một chuỗi phép tính không thể đoán trước. cuối cùng kích cỡ
Rất nhiều phụ thuộc vào điều này. Do đó, vì mỗi tác vụ MPI thực thi các luồng của nó theo một thứ tự khác nhau,kích cỡ
Hai hoặc ba nhiệm vụ MPI hơi khác nhau một chút... MPI_Allreduce
dẫn đến hành vi không xác định (nhưng không có sự cố).
Tôi là một lập trình viên xuất sắc, rất giỏi!