Tôi có một danh sách trên mỗi bộ xử lý phạm vi
và những con số. Tôi muốn xác định những danh sách này phạm vi
Số lượng tối đa của mỗi hàng trong .
Bốn danh sách đầu tiên mỗi bộ xử lý P0-P3 phạm vi
. Danh sách màu đỏ chứa MPI_Allreduce
Mỗi bộ xử lý sau đó sẽ nhận được giá trị tối đa cho mỗi hàng.
Đây là phiên bản hoạt động của mã của tôi:
#include
#include
#include
#include
//#xác định KEY_MAX 100
cấu trúc typedef{
int myrank;
int số;
int *phạm vi;
} SubDomainKeyTree;
void compRange(SubDomainKeyTree *s, int myrank, int numprocs){
s->myrank = myrank;
s->numprocs = numprocs;
// Cấp phát bộ nhớ cho phạm vi (numprocs+1)
s->range = malloc((numprocs+1) * sizeof(int));
// Tính toán các giá trị phạm vi
for(int p=0; p<=numprocs; p++){
s->range[p] = rand()%100;
}
for(int p=0; pnumprocs; p++){
if(s->myrank == p){
for(int k=0; k<=s->numprocs; k++){
printf("Bộ xử lý %d: %d số ngẫu nhiên là %d\n", p, k, s->range[k]);
}
printf("\n");
}
}
}
void compDynRange(SubD *s){
int rangeForAll[s->numprocs+1];
//////////////////////////////////////
// Điều này không thực sự hiệu quả //
//////////////////////////////////////
for(int r=0; r<=s->numprocs; r++){
MPI_Allreduce(&s->range[r], &rangeForAll[r], 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
}
for(int p=0; pnumprocs; p++){
if(s->myrank == p){
for(int k=0; k<=s->numprocs; k++){
s->range[k] = rangeForAll[k];
printf("Bộ xử lý %d: %d số ngẫu nhiên sau MPI_Allreduce là %d\n", p, k, s->range[k]);
}
printf("\n");
}
}
}
int main(int argc, char **argv){
tên intLen;
tên bộ xử lý char[MPI_MAX_PROCESSOR_NAME];
int myrank; // Thứ hạng của bộ xử lý
int numprocs; // Số lượng tiến trình
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Get_processor_name(processorName,&nameLen);
MPI_Trạng thái trạng thái;
thời gian_t t;
srand((unsigned)time(NULL)+myrank*numprocs+nameLen);
SubD;
compRange(&s, myrank, numprocs);
compDynRange(&s);
MPI_Finalize();
return 0;
}
Vòng lặp for tôi đang sử dụng có vẻ rất kém hiệu quả đối với tôi. Ở đây tôi tính toán giá trị tối đa cho từng hàng của tất cả các danh sách một cách tuần tự.
Nhưng tôi có thể sử dụng mà không cần vòng lặp for MPI_Allreduce
吗?
Tôi đã thử sử dụng nó thay vì vòng lặp for không hoạt động.
MPI_Allreduce(&s->range, &rangeForAll, s->numprocs+1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
Bất cứ ai có thể cho tôi một gợi ý về cách làm điều này?
Như đã được gợi ý trong các nhận xét, lỗi bạn gặp phải trong mã là bạn không truyền các mảng chứa bộ đệm gửi và nhận mà là một số gợi ý tới chúng. Tôi đoán lỗi chỉ xuất phát từ việc sử dụng ban đầu một phần tử (như &s->phạm vi[r]
), điều này hoàn toàn chính xác, bằng cách xóa quyền truy cập chỉ mục (tức là &s->phạm vi
) Điều này là sai.
Như đã đề cập trước đó, hãy sử dụng:
MPI_Allreduce(s->range, rangeForAll, s->numprocs+1, MPI_INT, MPI_MAX, MPI_COMM_WORLD)
Thế thôi. Tuy nhiên, vì bạn muốn đưa kết quả vào s->phạm vi
Mảng thay vì tạm thời phạm viXaTất cả
mảng, vì vậy tốt hơn hết là không xác định mảng sau và sử dụng MPI_IN_PLACE
từ khóa làm tham số gửi, sử dụng s->phạm vi
như nhận các tham số. Cuộc gọi trở thành:
MPI_Allreduce(MPI_IN_PLACE, s->phạm vi, s->numprocs+1, MPI_INT, MPI_MAX, MPI_COMM_WORLD)
Và s->phạm vi
Hoạt động như một bộ đệm gửi và nhận. Vì vậy, kết quả cuối cùng sẽ được định vị sau khi gọi s->phạm vi
đệm, bạn không cần phải sao chép một cách rõ ràng.
Tôi là một lập trình viên xuất sắc, rất giỏi!